利用栈解决:NC5.二叉树根节点到叶子节点的所有路径和

题目概述:
给定一个二叉树的根节点root,该树的节点值都在数字\ 0-9 0−9 之间,每一条从根节点到叶子节点的路径都可以用一个数字表示。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n

例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123 来代替。
找出根节点到叶子节点的所有路径表示的数字之和

算法思路:
本题考虑到要从根节点到叶子节点的遍历,那么就需要从根节点逐层遍历到叶节点,我采用的时广度优先遍历,对每一个遍历到的节点都遍历其左右子节点,然后将该节点存在的左右子节点压入到栈Stack中;并且对应的定义一个Stack2栈用来存放路径值为(当前节点值*10+其左/右节点值);然后进行压栈、弹栈操作,知道某个节点的左右子节点都为空(遍历到叶子节点),于是对路径值进行累加操作。

算法实现:

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    public int sumNumbers (TreeNode root) {
        // write code here
        //特殊情况
        if (root==null){
            return 0;
        }
        //对于每一个结点遍历是否有左右子树
        //定义两个栈用来存储结点和值
        Stack<TreeNode> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        //先将root节点压栈
        stack1.push(root);
        stack2.push(root.val);
        //对每个节点进行遍历后将左右子节点压栈
        //定义一个变量用来存储结果
        int res = 0;
        while(stack1.size()!=0&&stack2.size()!=0){
            //先将栈顶元素弹出
            TreeNode node = stack1.pop();
            //当前节点的值
            int val = stack2.pop();
            //如果弹出的节点没有左右子节点时
            if (node.left==null&&node.right==null){
                //则路径到达终点,就将路径相加
                res += val;
            }else{
                if (node.left!=null){
                    //左子节点不空
                    //将左子节点压栈
                    stack1.push(node.left);
                    //将当前的路径值压栈
                    stack2.push(val*10+node.left.val);
                }
                if (node.right!=null){
                    //右子节点不为空
                    stack1.push(node.right);
                    //将路径值压栈
                    /*
                    注意:这里不能使用pop(),因为如果使用pop(),那么两次都得pop,但是第二次的pop已经是left算出来对应的值了
                     */
                    stack2.push(val*10+node.right.val);
                }
            }
        }
        return res;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值