剑指offer面试题8:二叉树的下一个节点(Java 实现)

本文介绍了一种算法,用于在二叉树的中序遍历中找到给定节点的下一个节点。算法区分了有右子树和无右子树的节点,并详细解释了每种情况下的处理方式。测试涵盖了各种二叉树结构,确保算法的正确性和鲁棒性。

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

题目:给定一个二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了左右子节点外,还包含父节点。

思路:

节点分为有右子树和没有右子树两大类:
1. 如果节点有右子树,那么它的下一个节点为它右子树的最左节点
2. 如果节点没有右子树,也可以分为两类:(代码中可以统一处理)

    (a)它是父节点的左孩子,那么它的下一个节点就是它的父节点
    
    (b)它是父节点的右孩子,那就要从下往上遍历,找它父节点的父节点的父节点...直到当前节点是父节点左孩子的节点,那么它的下一个节点就是这个节点的父节点。

测试用例:

功能测试:普通二叉树(完全二叉树、非完全二叉树)、不同位置的节点。

边界测试:特殊二叉树(所有节点都没有右子节点的二叉树、所有节点都没有左子节点的二叉树、只有一个节点的二叉树)

负面测试:二叉树的根节点指针为空。

 

public class TreeLinkNode {
	int val;
	TreeLinkNode left = null;
	TreeLinkNode right = null;
	TreeLinkNode next = null;
	TreeLinkNode(int val){
		this.val = val;
	}
}

public class test_eight {
		TreeLinkNode GetNode(TreeLinkNode node){
			if(node == null)return null;
			if(node.right != null){         //当节点有右子树时
				node = node.right;
				while(node.left != null){   //找到右子树的最左节点
					node = node.left;
				}
				return node;
			}
			
			while(node.next != null){     //节点没有右子树的情况(if...else)
				if(node.next.left == node){
					return node.next;
				}else{
					node = node.next;      //是父节点的左孩子
				}
			}
			return node;
		}
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值