BinaryTreePaths_leetcode257

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();
    }

简化分析

标准的解法,可以简化一点的是:

  • 每次向下一层,把这一层的信息带到下一层去,在叶子节点时入栈即可
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值