题目描述
请设计一个算法,寻找二叉查找树(牛客网上的“寻找下一个节点”那道题中说的是二叉树,注意区别)中指定结点的下一个结点(即中序遍历的后继)。
给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class Successor {
public int findSucc(TreeNode root, int p) {
// write code here
if(root==null) return -1;
TreeNode t = root;
Stack<TreeNode> parents = new Stack<TreeNode>();
while(t!=null&&t.val!=p){
parents.add(t);
if(t.val > p){
t = t.left;
}else if(t.val < p){
t = t.right;
}
}
if(t==null) return -1; //不存在值为p的节点
//如果t节点有右子树
if(t.right!=null){
TreeNode rightSubTree = t.right;
while(rightSubTree.left!=null){
rightSubTree = rightSubTree.left;
}
return rightSubTree.val;
}else{
while(!parents.isEmpty()){
TreeNode tmp = parents.pop();
if(tmp.left==t) return tmp.val;
t = tmp;
}
return -1;
}
}
}