难度:中等
目录
一、问题描述
这里直接采用LeetCode上面的问题描述。
设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
如果指定节点没有对应的“下一个”节点,则返回null
。
下面给出示例:
二、思路
1、解题思路
可以将该题看成在二叉搜索树中,寻找只大于指定节点的 一个节点,因为该树是二叉搜索树,所以具有以下特征:
- 若左子树不为空,则左子树上所有的节点都小于根节点。
- 若右子树不为空,则右子树上所有的节点都小于根节点。
- 左右子树也为二叉搜索树。
这里我们的目标节点为 p:分下面两种情况讨论
情况一:p节点存在右孩子:假设p节点 == 5,那么需要从p节点的右子树中找到一个只大于p节点的节点。那么需要判断p节点的右节点是否为NULL,如果是NULL那么直接返回NULL即可。如果p节点的右孩子节点不为空,则要搜索p节点的右孩子直至为叶子节点为止。即为刚好大于p节点的节点。
情况二:p节点不存在右孩子:那么需要从根节点开始搜索,保存一个大于p节点的节点为 ans ,每次向下搜索如果该节点大于p节点都更新为ans,直至搜索至p节点,那么保存的节点 ans一定为刚好大于 p节点的节点。假设p节点 == 2 ,刚开始更新 ans == 5,5 > 2 往左子树进行搜索;3 > 2 ,再更新 ans == 3,往左子树搜索; 1 < 2 往右子树搜索 2 == 2。此时直接返回 ans ==3 即可。
三、解题
1、代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* inorderSuccessor(struct TreeNode* root, struct TreeNode* p) {
struct TreeNode *ans = NULL;
//往p节点的右子树搜索,找到p节点右子树最小的节点返回即为节点p的下一个节点
if (p->right != NULL) {
ans = p->right;
while (ans->left) {
ans = ans->left;
}
return ans;
}
//循环结束后保留左子树中刚好大于 p节点的节点 为 ans
while (root) {
if (root->val > p->val) {
ans = root;
root = root->left;
} else {
root = root->right;
}
}
return ans;
}
2、时间复杂度 and 空间复杂度
时间复杂度:
空间复杂度:O(1)