劍指offer面試題8:二叉樹的下一個節點(Java 實現)
阿新 • • 發佈:2019-01-05
題目:給定一個二叉樹和其中的一個節點,如何找出中序遍歷序列的下一個節點?樹中的節點除了左右子節點外,還包含父節點。
思路:
節點分為有右子樹和沒有右子樹兩大類:
-
如果節點有右子樹,那麼它的下一個節點為它右子樹的最左節點
-
如果節點沒有右子樹,也可以分為兩類:(程式碼中可以統一處理)
(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; } }