剑指 Offer II 053. 二叉搜索树中的中序后继
中等
给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null 。
节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。
示例 1:
![](https://i-blog.csdnimg.cn/blog_migrate/41c5c2775dba5ea4070f2663943b9ed4.png)
输入:root = [2,1,3], p = 1
输出:2
解释:这里 1 的中序后继是 2。请注意 p 和返回值都应是 TreeNode 类型。
示例 2:
![](https://i-blog.csdnimg.cn/blog_migrate/485697eb754d0af3f614a02e3c5611d6.png)
输入:root = [5,3,6,2,4,null,null,1], p = 6
输出:null
解释:因为给出的节点没有中序后继,所以答案就返回 null 了。
题解
先创建一个存储节点的集合
中序遍历,把节点添加到集合
遍历集合,找到匹配节点与目标节点一致
在第三步的基础上的下一个节点就是中序后继节点,返回该节点,否则返回null
/**
* 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) {
List<TreeNode> list = new ArrayList<>();
infixOrder(root,list);
for (int i = 0; i < list.size(); i++) {
if(p.val == list.get(i).val && i + 1 < list.size()){
System.out.println(list.get(i + 1));
return list.get(i + 1);
}
}
return null;
}
public static void infixOrder(TreeNode root,List<TreeNode> list){
if(root != null){
if(root.left != null){
infixOrder(root.left,list);
}
list.add(root);
if(root.right != null){
infixOrder(root.right,list);
}
}
}
}