1. 程式人生 > >劍指offer面試題8:二叉樹的下一個節點(Java 實現)

劍指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;
		}
	}