給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點而且返回。注意,樹中的結點不只包含左右子結點,同時包含指向父結點的指針。java
/* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } } */
要求中序遍歷的下一個節點,那麼首先須要對節點進行分類,哪些節點的下一個節點是是父節點,哪些節點的下一個節點與子節點有關
上圖將節點分紅了三類,實際上咱們能夠根據紅色箭頭的指向,分紅兩類,紫色和橙色的節點爲一類,藍色的爲一類this
紫色和橙色節點:共同點都是自己沒有右孩子。spa
藍色節點:該節點有右孩子指針
感受文字描述有點囉嗦,下面直接看代碼,總而言之就是將節點分紅了兩大類(根據有沒有右孩子),而後每一個大類又分紅了兩個小類code
public TreeLinkNode GetNext(TreeLinkNode pNode) { if(pNode==null) return null; if(pNode.right!=null){ //若是有右子樹,則找右子樹的最左節點 pNode = pNode.right; while(pNode.left!=null) pNode = pNode.left; return pNode; } while(pNode.next!=null){ //沒右子樹,則找第一個當前節點是父節點左孩子的節點 if(pNode.next.left==pNode) return pNode.next; pNode = pNode.next; } return null; //退到了根節點仍沒找到,則返回null }
本題的關鍵點在於畫出中序遍歷的圖,發現規律,將節點進行分類
歡迎關注:小秋的博客圖片