剑指offer-面试题58-二叉树的下一个结点

package case58_GetBinaryTreeNextNode;

/**
 * 题目: 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,
 * 还有一个指针指向父节点的指针。
 * 
 * @author WangSai
 *
 */
public class GetBinaryTreeNextNode {

	/**
	 * 
	 * @param root,树的根节点
	 * @param MyNode,待查找的节点
	 * @return 树的中序遍历的MyNode节点的下一个子节点
	 */
	private static BinaryTreeNode getMyInOrderTraverNexNode(BinaryTreeNode root, BinaryTreeNode MyNode) {
		// root||mynode为null
		if (root == null || MyNode == null)
			return null;
		// MyNode为根节点root
		if (root == MyNode) {
			// 1.有 右子节点
			if (MyNode.rchild != null) {
				BinaryTreeNode temp = MyNode.rchild;
				while (temp.lchild != null) {
					temp = temp.lchild;
				}
				return temp;
			}
			// 2.有 左子节点,没有右子节点
			// 3.没有左右子节点
			else if (root.rchild == null) {
				return null;
			}
		}
		// MyNode不为根节点
		else {
			// 1,该节点 有右子节点
			if (MyNode.rchild != null) {
				BinaryTreeNode temp = MyNode.rchild;
				while (temp.lchild != null) {
					temp = temp.lchild;
				}
				return temp;
			}
			// 2,该节点 没有右子节点
			else {
				// 1),该节点为父节点的左子节点
				if (MyNode == MyNode.parent.lchild)
					return MyNode.parent;
				// 2),该节点为父节点的右子节点
				else {
					BinaryTreeNode temp = MyNode;
					if (temp.parent == root) {
						return null;
					}
					// 该节点的父节点的是不是左子节点,一直向上寻找父节点,一直到是某一个节点的子节点
					while (temp.parent != temp.parent.parent.lchild) {
						if (temp.parent.parent == root) {
							return null;
						}
						temp = temp.parent;
					}
					return temp.parent.parent;
				}
			}
		}
		return null;
	}

	public static void main(String[] args) {
		System.out.println("test1--");
		test1();
		System.out.println("test2--");
		test2();
		System.out.println("test3--");
		test3();
		System.out.println("test4--");
		test4();
	}

	// 树只有一个根节点时
	public static void test1() {
		// ............1...............................................................
		BinaryTreeNode root = new BinaryTreeNode(1);
		System.out.println("root的下一个节点:null:" + '\t' + getMyInOrderTraverNexNode(root, root));
	}

	// 树有两个节点,根节点和右子节点
	public static void test2() {
		// ............1...............................................................
		// ........../....\............................................................
		// ...............3...........................................................
		BinaryTreeNode root = new BinaryTreeNode(1);
		BinaryTreeNode N3 = new BinaryTreeNode(3);
		root.rchild = N3;
		N3.parent = root;
		System.out.println("root的下一个节点:3:" + '\t' + getMyInOrderTraverNexNode(root, root).data);
		System.out.println("N3的下一个节点:null:" + '\t' + getMyInOrderTraverNexNode(root, N3));
	}

	// 树有两个节点,根节点和左子节点
	public static void test3() {
		// ............1...............................................................
		// ........../....\............................................................
		// ..........2...............................................................
		BinaryTreeNode root = new BinaryTreeNode(1);
		BinaryTreeNode N2 = new BinaryTreeNode(2);
		root.lchild = N2;
		N2.parent = root;
		System.out.println("root的下一个节点:null:" + '\t' + getMyInOrderTraverNexNode(root, root));
	}

	// 树有多个节点
	public static void test4() {
		// ............1...............................................................
		// ........../....\............................................................
		// .........2......3...........................................................
		// ......./..\.../...\..........................................................
		// ......4...5...6....7.........................................................
		// ...../.....\../......\.......................................................
		// ....8.....9..10......11.......................................................
		BinaryTreeNode root = new BinaryTreeNode(1);
		BinaryTreeNode N2 = new BinaryTreeNode(2);
		BinaryTreeNode N3 = new BinaryTreeNode(3);
		BinaryTreeNode N4 = new BinaryTreeNode(4);
		BinaryTreeNode N5 = new BinaryTreeNode(5);
		BinaryTreeNode N6 = new BinaryTreeNode(6);
		BinaryTreeNode N7 = new BinaryTreeNode(7);
		BinaryTreeNode N8 = new BinaryTreeNode(8);
		BinaryTreeNode N9 = new BinaryTreeNode(9);
		BinaryTreeNode N10 = new BinaryTreeNode(10);
		BinaryTreeNode N11 = new BinaryTreeNode(11);
		root.lchild = N2;
		root.rchild = N3;
		N2.lchild = N4;
		N2.rchild = N5;
		N2.parent = root;
		N3.lchild = N6;
		N3.rchild = N7;
		N3.parent = root;
		N4.lchild = N8;
		N4.parent = N2;
		N5.rchild = N9;
		N5.parent = N2;
		N6.lchild = N10;
		N6.parent = N3;
		N7.rchild = N11;
		N7.parent = N3;
		N8.parent = N4;
		N9.parent = N5;
		N10.parent = N6;
		N11.parent = N7;
		System.out.println("N11的下一个节点:null" + '\t' + getMyInOrderTraverNexNode(root, N11));
		System.out.println("N9的下一个节点:1" + '\t' + getMyInOrderTraverNexNode(root, N9).data);
		System.out.println("N2的下一个节点:5" + '\t' + getMyInOrderTraverNexNode(root, N2).data);
		System.out.println("N8的下一个节点:4" + '\t' + getMyInOrderTraverNexNode(root, N8).data);
		System.out.println("N3的下一个节点:7" + '\t' + getMyInOrderTraverNexNode(root, N3).data);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值