📅  最后修改于: 2023-12-03 15:39:42.010000             🧑  作者: Mango
要打印一个二叉树结点的祖先,我们可以从该结点开始遍历,一直到根节点。如果我们用递归实现,非常简单。
但有时候我们需要避免使用递归,因为递归可能会导致栈溢出或运行效率较低等问题。这时我们可以考虑用迭代的方法来实现。
下面是一种不递归的实现方式。
首先,我们需要用一个栈来存储遍历过的结点,初始化时将根节点加入栈中。
接着,我们不断地从栈中取出结点,打印它的值,并将其孩子结点加入栈中。
当遇到目标结点时,停止遍历,此时栈中存储的结点就是该结点的祖先。
下面是具体的实现代码:
def print_ancestors(root, target):
if not root:
return
stack = [root]
ancestors = []
while stack:
node = stack.pop()
if node == target:
print("Ancestors of the target node:")
for ancestor in ancestors:
print(ancestor.data, end=" ")
return
if node.right:
stack.append(node.right)
ancestors.append(node.data)
if node.left:
stack.append(node.left)
ancestors.append(node.data)
ancestors.pop()
print("Target node not found.")
这段代码首先判断根节点是否为空,然后初始化栈和祖先列表。
接着进入迭代过程,每次取出最后加入栈的结点,并将其孩子结点加入栈中。
如果遇到目标结点,就打印祖先列表,并返回。
如果没有找到目标结点,就在迭代过程中继续遍历,直到栈为空。
我们可以通过下面的二叉树来测试这个函数:
10
/ \
8 2
/ \ /
3 5 2
如果我们要打印结点5的祖先,就可以调用该函数,第一个参数为根节点10,第二个参数为结点5。
root = Node(10)
root.left = Node(8)
root.right = Node(2)
root.left.left = Node(3)
root.left.right = Node(5)
root.right.left = Node(2)
print_ancestors(root, root.left.right)
输出结果为:
Ancestors of the target node:
8 10
可以看到,该函数成功打印了结点5的祖先8和10。
总体来说,用栈来实现不递归的遍历二叉树结点的祖先是一种简单有效的方法,在某些情况下可以替代递归实现,提高程序的性能。