題目:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點而且返回。注意,樹中的結點不只包含左右子結點,同時包含指向父結點的指針。spa
分析:
根據中序遍歷的特色,要找到一個節點的下一個節點無非就是三種狀況:
一、有右子樹,這時只須要把其右孩子做爲下一個遍歷的(並非要找的)節點,而後沿着該節點的左子樹(若是有的話)出發,直到遇到葉子節點,那麼該葉子節點就是其下一個要找的節點;
二、沒有右子樹,則判斷該節點是不是其父節點的左孩子,若是是則其下一個要找的節點是其父節點;
三、若是不是其父節點的左孩子,則把其父節點做爲下一個遍歷的節點,向上回溯,直到找到節點沒有父節點或者節點是其父節點的左孩子爲止。
綜合這三種狀況就能夠找到二叉樹中任意一個節點的下一個節點。指針
代碼以下:code
public class FindNextNode { public BinaryTreeNode getNextNode(BinaryTreeNode pNode){ if(pNode==null){ return null; } //若是該節點有右節點 if(pNode.getRightNode()!=null){ BinaryTreeNode tempNode=pNode.getRightNode(); while(tempNode.getLeftNode()!=null){ tempNode=tempNode.getLeftNode(); } return tempNode; } //若是沒有右節點,是其父節點的左子節點 if(pNode.getFatherNode()==null){ return null; } if(pNode.getFatherNode().getLeftNode()==pNode){ return pNode.getFatherNode(); } //若是沒有右節點,是其父節點的右子節點,一直向上找父節點直到沒有父節點 if(pNode.getFatherNode()==null){ return null; } if(pNode.getFatherNode().getRightNode()==pNode){ BinaryTreeNode tempNode=pNode.getFatherNode(); while(tempNode.getFatherNode()==null){ tempNode=tempNode.getFatherNode(); } return tempNode; } return null; } }