📌  相关文章
📜  打印给定二叉树节点的祖先而不递归(1)

📅  最后修改于: 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。

总体来说,用栈来实现不递归的遍历二叉树结点的祖先是一种简单有效的方法,在某些情况下可以替代递归实现,提高程序的性能。