二叉查找树中寻找下一个节点

题目描述

请设计一个算法,寻找二叉查找树(牛客网上的“寻找下一个节点”那道题中说的是二叉树,注意区别)中指定结点的下一个结点(即中序遍历的后继)。

给定树的根结点指针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;
		 }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值