BinaryTreePaths_257
题目描述
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/
2 3
5输出: [“1->2->5”, “1->3”]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
思路分析
经典的一道先序遍历与栈结合的题,利用先序遍历节点的顺序,与栈结合进行解题。
从根节点出发,要知道所有路径,首先将最后一个节点根节点入栈,分别解决左子树的所有路径,和右子树的所有路径之后,等左子树和右子树的路径都找完了,根节点弹出(左子树的所有路径则递归向下搜寻,右子树同理),采用先序遍历的方式,根节点入栈,递归求解左子树右子树,如果当前节点为叶子节点,保存路径即可。直到根节点弹出,则路径求解完毕
Java代码
public static List<String> binaryTreePaths(TreeNode root){
//有多少个叶子节点就有多少条路径
//先序遍历,每遍历到一个节点就入栈,遍历到叶子节点,则把stack所有的值取出来,并且每个节点遍历完了就弹栈
//定义容器
Stack<Integer> stack=new Stack<Integer>();
ArrayList<String> paths=new ArrayList<String>();
if(root==null||(root.left==null&&root.right==null)){
if(root!=null){
paths.add(""+root.val);
}
return paths;
}
preOrder(root,stack,paths);
return paths;
}
public static void preOrder(TreeNode root,Stack stack,List<String> paths){
//对节点进行判断
if(root.left==null&&root.right==null){
//叶子节点则进行处理
StringBuilder sb=new StringBuilder();
for(int i = 0; i <stack.size(); i++) {
if(i==0){
sb.append(stack.get(i));
}else{
sb.append("->"+stack.get(i));
}
}
sb.append("->"+root.val);
paths.add(sb.toString());
}
//根节点非空则入栈
if(root!=null)
stack.push(root.val);
//遍历左子树
TreeNode left=root.left;
if(left!=null){
preOrder(left,stack,paths);
}
//遍历右子树
TreeNode right=root.right;
if(right!=null){
preOrder(right,stack,paths);
}
stack.pop();
}
简化分析
标准的解法,可以简化一点的是:
- 每次向下一层,把这一层的信息带到下一层去,在叶子节点时入栈即可