/**
* 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) {
//0.参数合法性判断
if(root==null||p==null){
return null;
}
//1.找到当前节点
TreeNode treeNode = getNode(root,p);
//后继结点
TreeNode suceessor = null;
//2.判断有没有右子树
if(treeNode.right==null){
//如果没有右子树,就要去找第一个大于它的祖节点
TreeNode node = root;
while(node!=null){
if(node.val>p.val){
suceessor = node;
node=node.left;
}else{
node=node.right;
}
}
}else{
//如果有右子树,去找右子树最左边的节点
suceessor = getLeftNode(treeNode.right);
}
return suceessor;
}
/**
在二分搜索树里找到某一个节点
*/
TreeNode getNode(TreeNode root, TreeNode p){
if(root.val==p.val){
return root;
}
if(root.val>p.val){
return getNode(root.left,p);
}
if(root.val<p.val){
return getNode(root.right,p);
}
return null;
}
/**
找一棵树的最左边的节点
*/
TreeNode getLeftNode(TreeNode root){
if(root.left==null){
return root;
}else{
return getLeftNode(root.left);
}
}
}
leetcode -- 面试题 04.06. 后继者
最新推荐文章于 2024-10-15 00:03:51 发布