📜  门| GATE-CS-2004 |第 55 题(1)

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

题目描述

给定一个根据二叉查找树中序遍历得到的节点值的下一个节点值,寻找这个节点在中序遍历中的下一个节点值。

假设二叉查找树中每个节点都有一个不同的后继。

例如,参见下图。

image1

上述二叉查找树中,中序遍历为 D, B, E, A, F, C 和给定的节点为“C”,则返回“E”。

以下是该问题的形式化描述:

  • 给定一个二叉查找树中的节点“x”。
  • 找到“x”的下一个节点,即中序遍历顺序中“x”的后继。
  • 假设每个节点都具有单独的下一个节点。
  • 如果不存在,则返回NULL。

函数签名如下:

def inorderSuccessor(root, x):
    pass

输入参数:

  • root:给定的二叉查找树(BST)的根节点。
  • x:需要找到其后继的节点。

输出参数:

  • 返回x节点在中序遍历中的下一个节点值(即后继节点的值)。

示例

输入:

root = Node(20)
root.left = Node(8);
root.right = Node(22);
root.left.left = Node(4);
root.left.right = Node(12);
root.left.right.left = Node(10);
root.left.right.right = Node(14);
x = root.left.right;

输出:

14

输入:

root = Node(20)
root.left = Node(8);
root.right = Node(22);
root.left.left = Node(4);
root.left.right = Node(12);
root.left.right.left = Node(10);
root.left.right.right = Node(14);
x = root.left.left;

输出:

8

解题思路

本题可以通过遍历二叉查找树来寻找“x”的后继,具体思路如下:

  • 如果x节点存在右子树,则x节点后继为右子树的最小值节点。
  • 如果x节点不存在右子树,那么x节点后继为第一个左子树包含x节点的祖先节点。

以下是具体实现,核心代码块只要40多行,用来解决这个问题非常方便。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderSuccessor(self, root: 'TreeNode', p: 'TreeNode') -> 'TreeNode':
        succ = None
        while root:
            if p.val < root.val:
                succ = root
                root = root.left
            else:
                root = root.right
        return succ

复杂度分析

  • 时间复杂度:$O(h)$,其中“h”表示树的高度。最坏的情况下,该算法需要遍历整棵树才能确定后继,时间复杂度为$O(n)$。
  • 空间复杂度:$O(1)$,由于该算法使用常数个指针来回收状态,因此它使用固定的空间。