📜  按照从 X 开始的给定模式获取二叉树的最后一个节点(1)

📅  最后修改于: 2023-12-03 15:10:09.139000             🧑  作者: Mango

按照给定模式获取二叉树的最后一个节点

有时候我们需要在二叉树中按照给定的模式获取最后一个节点,比如按照先序/中序/后序遍历的方式。这篇文章将为你介绍如何实现这一功能。

如何实现

我们可以采用递归的方式遍历二叉树,并且记录当前遍历的节点,最后返回最后一个经过的节点。以下是伪代码:

last_node = None

def get_last_node(root, pattern):
    if root is None:
        return
    if pattern == "preorder":
        global last_node
        last_node = root
    get_last_node(root.left, pattern)
    get_last_node(root.right, pattern)
    if pattern == "inorder":
        global last_node
        last_node = root
    get_last_node(root.right, pattern)
    if pattern == "postorder":
        global last_node
        last_node = root
    return last_node

以上代码中,我们使用了 last_node 作为全局变量保存最后一个经过的节点。递归函数 get_last_node 接受两个参数: root 表示当前正在遍历的节点, pattern 表示需要遍历的模式。如果当前节点为空,则直接返回。如果遍历方式是先序遍历,将当前节点保存为最后一个节点;如果遍历方式是中序遍历,则在遍历完左子树之后将当前节点保存为最后一个节点;如果遍历方式是后序遍历,则在遍历完左右子树之后将当前节点保存为最后一个节点。最后将 last_node 返回即可。

示例

以下是一个简单的示例,假设我们需要按照后序遍历的方式获取最后一个节点:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def get_last_node(root, pattern):
    last_node = None
    def dfs(root):
        nonlocal last_node
        if root is None:
            return
        if pattern == "preorder":
            last_node = root
        dfs(root.left)
        if pattern == "inorder":
            last_node = root
        dfs(root.right)
        if pattern == "postorder":
            last_node = root
    dfs(root)
    return last_node

# 创建一个二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)

# 输出最后一个节点
print(get_last_node(root, "postorder").val)

以上代码会输出 5,即按照后序遍历方式获取到最后一个节点 node5

结论

通过以上代码示例,我们成功实现了按照给定模式获取二叉树最后一个节点的功能。我们可以根据需要替换其中的遍历方式,从而实现不同的功能。这个算法的时间复杂度是 O(N),空间复杂度是 O(1)。