二叉树中找到一个节点的后继节点

本文介绍了一种在带有父节点指针的二叉树结构中寻找指定节点后继与前驱节点的方法。后继节点是指在中序遍历下紧随其后的节点,而前驱节点则是紧随其前的节点。文章提供了两种查找策略,并详细解释了当节点有右子树或无右子树时如何定位后继节点,以及当节点有左子树或无左子树时如何确定前驱节点。

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

这个结构比普通的二叉树节点结构多了一个指向父节点的perent指针。
假设有一颗Node类型的节点组成二叉树,树中的每个节点的parent指针都正确的指向自己的父节点,头结点的parent指向null。只给一个在二叉树中的某个节点node,请返回实现node的后继节点的函数。在二叉树的中序遍历的序列中,node的下一个节点叫做node的后继节点。在二叉树的中序遍历的序列中,node的前一个节点叫做node的前驱节点。
思路1:
通过parent找到头结点
然后中序遍历整棵二叉树,返回遍历后node的下一个节点
思路2:
通过二叉树结构,
node有右子树,那么node的后继节点一定是他整个右子树最左的节点
node没有右子树,要找到谁的左子树是以node结尾的,往上找,直到node是当前节点的左孩子,返回

在这里插入图片描述
9,没有右子树,向上找到了5,但是9并不是5的左孩子,再向上找到到了2,但是5也不是2的左孩子,在向上找,找到了1,这时候9正好是1的左孩子,返回1
1,有右子树,这个时候去找右子树最左边的节点,到了3,3还有左孩子,找到了6,返回6

	public static Node getSeccessorNode(Node node) {
		if (node == null) {
			return node;
		}
		if (node.right != null) {             //有右子树  
			return getLeftMost(node.right);
		} else {
			Node parent = node.parent;        //拿node的parent
			while (parent != null && parent.left != node) {  //当前节点等于父亲的左孩子了那就停
				node = parent;            //两个指针一起向上走
				parent = node.parent;
			}
			return parent;
		}
	}

	private static Node getLeftMost(Node node) {   //找最左边的节点		
		if (node == null) {
			return node;
		}
		while (node.left != null) {
			node = node.left;
		}
		return node;
	}

针对最右边的节点,他的后继就是null,这个时候他会一直向上找,去找他作为左孩子的那么父亲,结果找到头还是找不到,头的父亲是null,索性就直接返回这个null。

找前驱

同理
如果node有左子树,那么就是左子树的最右边的节点
如果node没有左子树,向上找,找他作为右孩子的父亲

	public static Node getPrecursor(Node node) {
		if (node == null) {
			return null;
		} 
		if (node.left != null) {
			return getRightMost(node.left);
		} else {
			Node parent = node.parent;
			while (parent != null && parent.right != null) {
				node = parent;
				parent = node.parent;
			}
			return parent;
		}
	}

	private static Node getRightMost(Node node) {
		// TODO Auto-generated method stub
		if (node == null) {
			return node;
		}
		if (node.right != null) {
			node = node.right;
		}
		return node;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值