美文网首页
《剑指offer第二版》面试题34:二叉树中和为某一值得路径(j

《剑指offer第二版》面试题34:二叉树中和为某一值得路径(j

作者: castlet | 来源:发表于2020-04-12 12:28 被阅读0次

    题目描述

    输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径。

    解题思路:

    1. 定义一个辅助栈,用于保存当前经过的节点。定义一个辅助变量num,用于保存辅助栈中路径的和。
    2. 前序遍历子树,遍历节点的时候,先将该节点压入辅助栈,并更新num。
      1. 如果如果当前是叶子节点,并且num等于输入的值,则说明找到了一条路径,打印stack里的路径。
      2. 如果不是叶子节点,则继续遍历左右子树。
      3. 遍历完左右子树后,返回父节点前,在路径上删除当前节点。

    代码

    void printPathWithNum(TreeNode root, int targetNum){
        if (root == null) {
            return;
        }
    
        Stack<TreeNode> pathHolder = new Stack<>();
        printPathWithNum(root, pathHolder, 0, targetNum);
    }
    
    void printPathWithNum(TreeNode root, Stack<TreeNode> pathHolder, int num, int targetNum){
        if (root == null) {
            return;
        }
        num = num + root.value;
        pathHolder.push(root);
        if (root.left == null && root.right == null) {
            // 如果是叶子节点,并且路径上节点值等于输入的值,则打印出这条路径
            if (num == targetNum) {
                System.out.println();
                for (int i = 0; i < pathHolder.size(); i++) {
                    System.out.print(pathHolder.get(i).value + " ");
                }
                pathHolder.pop();
                return;
            }
        }
    
        // 如果不是叶子节点,则遍历其左右子树
        if (root.left != null) {
            printPathWithNum(root.left, pathHolder, num, targetNum);
        }
        if (root.right != null) {
            printPathWithNum(root.right, pathHolder, num, targetNum);
        }
    
        // 返回父节点前,在路径上删除当前节点
        pathHolder.pop();
    }
    

    相关文章

      网友评论

          本文标题:《剑指offer第二版》面试题34:二叉树中和为某一值得路径(j

          本文链接:https://www.haomeiwen.com/subject/rguvmhtx.html