在堆栈中打印带叶值的二叉树路径

时间:2016-12-13 16:55:29

标签: java algorithm

使用叶节点值打印二叉树路径。当它回溯时,它应该删除' 3'从堆栈。如何修改代码来实现?我无法找到一个从堆栈中弹出值的地方。

// should print out "5 8 10", but it prints "5 3 8 10"
printPathWithStack(root, 5); 

      10
     /   \
    8      2
   /  \    /
 3    5  4

void printPathWithStack(Node root, int key)
{
    Stack<Node> path = new Stack<Node>();
    printPathWithStackHelper(root, key, path);
}

void printPathWithStackHelper(Node root, int key, Stack<Node> path)
{
    if (root == null) {
        return;
    }

    path.push(root);

    if (root.data == key && root.left == null && root.right == null) {
        while (!path.isEmpty()) {
            System.out.print(path.pop().data + " ");
        }
    } else if (root.left == null && root.right == null){
            path.pop();
     } 

    printPathWithStackHelper(root.left, key, path);
    printPathWithStackHelper(root.right, key, path);
}

2 个答案:

答案 0 :(得分:0)

嗯,以这种方式使用堆栈有点奇怪。

但是对于它的价值,当回溯时你应该简单地丢弃item.leftitem.right不等于最后检索项目的所有项目。这将为您提供根目录的路径。

答案 1 :(得分:0)

你可以推迟进入Stack,直到对左右孩子进行递归调用。

 if (root.data == key && root.left == null && root.right == null) 
 {
    path.push(root);
    while (!path.isEmpty()) 
    {
        System.out.print(path.pop().data + " ");
    }
    return;
 } 
 else if (root.left == null && root.right == null)
 {
        return;
 } 
 path.push(root);
 printPathWithStackHelper(root.left, key, path);
 printPathWithStackHelper(root.right, key, path);

希望它解决您的问题!

P.S。没有测试一般情况下的代码片段,希望你能做到所需的:)