原题链接(https://leetcode.cn/problems/P5rCT8)
给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。
输入:root = [2,1,3], p = 1
输出:2
输入:root = [5,3,6,2,4,null,null,1], p = 6
输出:nul
二叉搜索树是一种特殊的二叉树,对于一个节点,它的值一定大于其左子树的任何一个值,它的右子树的任何一个值都要大于它,几左子树<父节点<右子树。利用这个特性再查找二叉树的时候并不需去扫描每一个节点,既然题目要找最小的大于它的那么就是能走左子树就必须走左子树,走到右子树之后也需要去核验左子树否则就是右子树。如果右子树找到底都没有符合的那就没有任何一个数据符合了。同时因为需要匹配是一个树节点,那么如果这个节点有右子树那么一定是从那个右子树开始向左子树走得到的节点,不然才需要从根节点走。
如例2的访问流程应该是
首先p没有右子树所有从头开始
由于根节点的值小于6所以应该走右子树
最后得到null
假设将例2的p改为3这个节点那结果就不一样了
首先,3是有右子树的所以可以走右子树
然后右子树没有左子树所以得到4
假设有一个二叉搜索树如图
假设P为50
首先p没有右子树所以需要从根节点开始。
首先根节点的值小于50所以需要向右子树走,既走到65节点上
65大于50所以需要向左走,但是左子树的值是50不大于50所以左子树也走到了头,因此得到了结果65
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
TreeNode ans = null;
if (p.right != null) {
ans = p.right;
while (ans.left != null) {
ans = ans.left;
}
}
while (root != null) {
if (root.val > p.val) {
ans = root;
root = root.left;
} else {
root = root.right;
}
}
return ans;
}
}