给你一个二叉搜索树和其中的某一个结点,请你找出该结点在树中顺序后继的节点。
结点 p 的后继是值比 p.val 大的结点中键值最小的结点。
思路
一开始我是按照寻找找某节点的后继去写的
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
if (p->right) {
p = p->right;
while (p->left) p = p->left;
return p;
}
stack<TreeNode*>s;
s.push(nullptr);
TreeNode* cur = root;
while(cur != p) {
if (p->val < cur->val) {
s.push(cur);
cur = cur->left;
} else {
s.push(cur);
cur = cur->right;
}
}
while (s.top() != nullptr && s.top()->right== p) {
p = s.top();
s.pop();
}
return s.top();
}
};
很长,也比较慢
后来看别人的代码,是这样写的
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
TreeNode* res = NULL;
while (root) {
if (p->val < root->val) {
res = root;
root = root->left;
} else {
root = root->right;
}
}
return res;
}
};
直接根据二叉搜索树的性质去寻找的最大最小的节点。
感觉是二分查找,分治的思想。
凡是p->val < cur->val , 那么cur 就是一个可行的解。