1.题目
Given a binary tree, return all root-to-leaf paths.
For example, given the following binary tree:
1
/ \
2 3
\
5
All root-to-leaf paths are:
[“1->2->5”, “1->3”]
2.解法
新建一个名为arrayListSingle的ArrayList,存放遍历过的路径,采用前序遍历的方式,每遍历一个子节点就将正在遍历的节点存入arrayListSingle,每当从子节点遍历返回时,例如上面题中给的例子里从5返回2时,就将arrayListSingle的最后一个元素,也就是刚遍历过的子节点删除,当发现正在遍历的节点没有子节点的时候,就说明走到了叶子节点位置,arrayListSingle里存的就正好是一条从根节点到该叶子的路径,这时就将arrayListSingle里的路径以String形式存到最终结果List里。具体代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
// 存放最终的所有从根到叶子的路径
ArrayList<String> arrayList = new ArrayList<>();
// 对根节点为空这种特殊情况的处理
if(root == null)
return arrayList;
// 储存遍历的路径
ArrayList<Integer> arrayListSingle = new ArrayList<>();
// 先把根节点存进去
arrayListSingle.add(root.val);
// 开始递归前序遍历二叉树
go(root,arrayListSingle,arrayList);
return arrayList;
}
public static void go(TreeNode node,ArrayList<Integer> arr, ArrayList<String> arrayStr) {
// 遍历左节点
if(node.left != null) {
// 在遍历的路径中添加马上开始遍历的左节点,开始遍历左节点
arr.add(node.left.val);
go(node.left,arr,arrayStr);
// 遍历完左节点,从遍历的路径中删除左节点
arr.remove(arr.size() - 1);
}
// 遍历右节点
if(node.right != null){
// 在遍历的路径中添加马上开始遍历的右节点,开始遍历右节点
arr.add(node.right.val);
go(node.right,arr,arrayStr);
arr.remove(arr.size() - 1);
}
// 当左右节点都空时,说明这个节点是叶子节点,把当前路径处理下格式,放到最终的结果list中
if(node.left == null && node.right == null) {
String temp = "" + arr.get(0);
for (int i = 1; i < arr.size(); i++) {
temp = temp + "->" + arr.get(i);
}
arrayStr.add(temp);
}
}
}版权声明:本文为SHENMEGUI_32原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。