设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。
如果指定节点没有对应的“下一个”节点,则返回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.p存在右子树,那么p的后继就是p.right子树的最左节点
2.p不存在右子树,那么p的后继就是p所在子树的最近左孩子的父节点
#include <iostream>
using namespace std;
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 getres(root,p);
}
private:
TreeNode* getres(TreeNode *root,TreeNode* p){
TreeNode *node = NULL;
if(p->right){
node = p->right;
while(node->left!=NULL){
node = node->left;
}
return node;
}else{
TreeNode *res=NULL;
node = root;
while(p!=node){
if(node->val > p->val){
res = node;
node = node->left;
}else{
node = node->right;
}
}
return res;
}
}
};
int main(){
Solution *ps = new Solution();
TreeNode *r1 = new TreeNode(5);
TreeNode *r2 = new TreeNode(3);
TreeNode *r3 = new TreeNode(6);
TreeNode *r4 = new TreeNode(2);
TreeNode *r5 = new TreeNode(4);
TreeNode *r6 = new TreeNode(1);
r1->left = r2;
r1->right = r3;
r2->left = r4;
r2->right = r5;
r4->left = r6;
TreeNode *res = ps->inorderSuccessor(r1,r5);
cout<<res->val<<endl;
return 0;
}