刷题-力扣-面试题 04.06. 后继者

题目链接

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/successor-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

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

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

题目分析

  1. 根据题目描述,计算二叉搜索树中指定节点的下一个节点
  2. 先利用二叉搜索树的特点找到指定节点p
  3. 若p的右子树存在,则p的下一个节点必定是p右子树的中序遍历第一个节点
  4. 若p的右子树不存在,则p的的下一个节点是p作为左子树的根节点

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
        return inorderSuccessor(root, nullptr, p);
    }

    TreeNode* inorderSuccessor(TreeNode* child, TreeNode* father, TreeNode* p) {
        TreeNode* res = nullptr;
        if (child->val == p->val) {
            // child->right
            if (child->right) {
                TreeNode* res = child->right;
                while (res->left) {
                    res = res->left;
                }
                return res;
            } else {
                return father;
            }
        }else if (child->val > p->val) {
            return inorderSuccessor(child->left, child, p);
        } else {
            return inorderSuccessor(child->right, father, p);
        }
    }
};
posted @ 2022-02-16 16:33  韩亚光  阅读(27)  评论(0编辑  收藏  举报