劍指offer第二版面試題7:二叉樹的下一個節點(JAVA版本)

題目:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點而且返回。注意,樹中的結點不只包含左右子結點,同時包含指向父結點的指針。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;
    }
}
相關文章
相關標籤/搜索