寻找二叉树中序后继节点(Java语言实现)

本文介绍了一种二叉树中寻找指定节点后继节点的方法。主要分为三种情况:有右子树时,后继节点为右子树中最左侧的节点;无右子树但为父节点的左子节点时,后继节点即为父节点;无右子树且为父节点的右子节点时,需向上遍历找到第一个作为左子节点的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 后继节点查找分成两种情况:
        
        1.一个节点有右子树,那么它的下一个节点就是它的右子树中的最左子节点。例如b的后继节点是h。
        
        2.一个节点没有右子树时分两种情况:
        
            (1)当前节点是它父节点的左子节点,那么它的下一个节点就是它的父节点。
            (2)当前节点是它父节点的右子节点,此时沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,如果这个节点          
              存在,那么这个节点的父节点就是我们要找的下一个节点。

//二叉树的节点类

public class Node {

	public int data;
	public Node leftChild;
	public Node rightChildNode;
	public Node  parentNode;
	public Node(int value)
	{
		this.data  = value;
	}
}
//构造二叉树

public void  insert (int value){
		Node curNode = root;
		Node parentNode = root;
		
		Node node = new Node(value);
		
		if(root == null){
			root = node;
			return;
		}
		while(true){
			 parentNode = curNode;
			 if(root.data >value){
				
				curNode = curNode.leftChild;
				if(curNode == null){
					parentNode.leftChild = node;
					node.parentNode = parentNode;
					return;
				}
			}
			 else{
				
				 curNode = curNode.rightChildNode;
				 if(curNode == null){
					 parentNode.rightChildNode = node;
					node.parentNode = parentNode;
					 return;
				 }
			 }
		}
	}
//查找后继节点


	public Node findAterNode(int value){
		Node curNode = root;
		Node parentNode = null;
		Node afterNode = null;
		Node afterParent = null;
		
		//找到该节点
		boolean isLeftchild = false;
		
		while(curNode.data != value){
			parentNode = curNode;
			if(curNode.data > value){
				curNode = curNode.leftChild;
				isLeftchild = true;
			}
			else{
				curNode = curNode.rightChildNode;
				isLeftchild =false;
			}
		}
					
		
		//第一种情况,该节点有右子节点
		if(curNode.rightChildNode != null){
			curNode = curNode.rightChildNode;
			while(curNode.leftChild != null){
				afterParent = afterNode;
				afterNode = curNode;
				curNode = curNode.leftChild;
			}
		}
		//第二种情况,该节点为其父节点的左子节点
		else if(isLeftchild){
			afterNode = parentNode;
		}
		
		//第三种情况,该节点为其父节点的右子节点;该情况需要在每个节点存储其父节点
		else{
			Node parent = curNode.parentNode;
			while(parent != null && parent.leftChild != curNode){
				curNode = parent;
				parent = curNode.parentNode;
				
			}
			afterNode = parent;
		}
		
		return afterNode;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皓月星辰_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值