LeetCode 面试题 04.06. 后继者

一、题目

  设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。

如果指定节点没有对应的“下一个”节点,则返回 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)

猜你喜欢

转载自blog.csdn.net/zheliku/article/details/132833741
今日推荐