刷题-力扣-面试题 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
题目分析
- 根据题目描述,计算二叉搜索树中指定节点的下一个节点
- 先利用二叉搜索树的特点找到指定节点p
- 若p的右子树存在,则p的下一个节点必定是p右子树的中序遍历第一个节点
- 若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);
}
}
};