一、题目
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
如果指定节点没有对应的“下一个”节点,则返回 null
。
示例 1:
输入: root = [2,1,3], p = 1
2
/ \
1 3
输出: 2
示例 2:
输入: root = [5,3,6,2,4,null,null,1], p = 6
5
/ \
3 6
/ \
2 4
/
1
输出: null
二、C# 题解
此题思路和 LeetCode 面试题 04.05. 合法二叉搜索树 很类似,使用一个结点 last 记录上次访问的内容,当 last == p 时,该结点 node 即为 p 的后继结点。具体代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode InorderSuccessor(TreeNode root, TreeNode p) {
TreeNode last = null;
return Partition(root, p, ref last);
}
// 递归,中序遍历进行检查
public TreeNode Partition(TreeNode node, TreeNode p, ref TreeNode last) {
if (node == null) return null; // 递归出口
TreeNode left = Partition(node.left, p, ref last); // 左子树检查
if (left != null) return left; // 如果左子树找到答案则直接返回
if (last == p) return node; // 上一个结点为 p,则此结点为答案,直接返回
last = node; // 更新上一个节点
return Partition(node.right, p, ref last); // 返回右子树结果
}
}
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( n ) O(n) O(n)。