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

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

思路:

节点分为有右子树和没有右子树两大类:

  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 null;
		}
	}

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/85841947