1. 程式人生 > >演算法題(三十五):二叉樹的下一個結點

演算法題(三十五):二叉樹的下一個結點

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

分析

分情況討論:

1.如果結點有右孩子,則返回右子樹中最後一個左孩子;

2.如果結點沒有右孩子,且該結點是父結點的左孩子,則返回父結點;

3.如果結點沒有右孩子,且該結點是父結點的右孩子,則向上遍歷父結點,返回第一個當前節點是父節點左孩子的節點

程式碼

public class NextOne {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeLinkNode node1 = new TreeLinkNode(1);
		TreeLinkNode node2 = new TreeLinkNode(2);
		TreeLinkNode node3 = new TreeLinkNode(3);
		TreeLinkNode node4 = new TreeLinkNode(4);
		TreeLinkNode node5 = new TreeLinkNode(5);
		TreeLinkNode node6 = new TreeLinkNode(6);
		TreeLinkNode node7 = new TreeLinkNode(7);
		TreeLinkNode node8 = new TreeLinkNode(8);
		TreeLinkNode node9 = new TreeLinkNode(9);
		node6.left = node2; node6.right = node8; node2.next = node6; node8.next = node6;
		
		node2.left = node1; node2.right = node4; node8.left=node7; node8.right = node9; 
		node1.next = node2; node4.next = node2; node7.next = node8; node9.next = node8;
		
		node4.left = node3; node4.right = node5; node3.next = node4; node5.next = node4;
		
		System.out.println(GetNext(node1).val);
	}
	
	//自己寫的
	public static TreeLinkNode next(TreeLinkNode node){
		if(node == null){
			return null;
		}
		TreeLinkNode lastOne = null;

		if(node.right != null){
			lastOne = node.right;
			TreeLinkNode temp = lastOne;
			while(lastOne != null){
				temp = lastOne;
				lastOne = lastOne.left;
			}
			lastOne = temp;
			return lastOne;
		}
		if(node.next.left == node){
			return node.next;
		}
		TreeLinkNode parent = node.next;
		while(parent!=null){
			if(parent.next.left == parent){
				return parent.next;
			}
			parent = parent.next;
		}
		return null;
		
	}
	//牛客網上的
	public static TreeLinkNode GetNext(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 (node.next.left == node)
				return node.next;
			node = node.next;
		}
		return null; // 退到了根節點仍沒找到,則返回null
	}

}

class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}