使用叶节点值打印二叉树路径。当它回溯时,它应该删除' 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);
}
答案 0 :(得分:0)
嗯,以这种方式使用堆栈有点奇怪。
但是对于它的价值,当回溯时你应该简单地丢弃item.left
或item.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。没有测试一般情况下的代码片段,希望你能做到所需的:)