1. 程式人生 > >面試題8:二叉樹的下一個節點

面試題8:二叉樹的下一個節點

可能 除了 遍歷算法 term size csdn play 技術 ptr

一.題目

給定一棵二叉樹和其中的一個結點,如何找出中序遍歷順序的下一個結點?樹中的結點除了有兩個分別指向左右子結點的指針以外,還有一個指向父結點的指針。

二.思路

分析題目之後,我們發現,待處理節點只存在三種狀態,我們分別處理即可:

技術分享圖片

  1. 待處理節點有右子樹。那麽它的下一個節點為其右子樹的最左子節點,如上圖節點3的下一個節點為8;
  2. 待處理節點無右子樹,且是父節點的左節點。那麽它的下一個節點為其父節點,如上圖節點5的下一個節點為3;
  3. 待處理節點無右子樹,且是父節點的右節點。我們可以沿著它的父節點向上遍歷,直至找到一個這樣的節點,該節點是其父節點的左子節點,那麽該節點的父節點就是所求節點,如上圖節點6的下一個節點為1.

三.代碼

BinaryTreeNode* GetNext(BinaryTreeNode* pNode){
    
    if(pNode == nullptr)
        return nullptr;

    BinaryTreeNode* pNext = nullptr;
    if(pNode->m_pRight != nullptr){
        BinaryTreeNode* pRight = pNode->m_pRight;
        while(pRight->m_pLeft != nullptr)
            pRight 
= pRight->m_pLeft; pNext = pRight; } else if(pNode->m_pParent != nullptr){ BinaryTreeNode* pCurrent = pNode; BinaryTreeNode* pParent = pNode->m_pParetn; while(pParent != nullptr && pNode = pParent->m_pRight){ pCurrent = pParent; pParent
= pParent->m_pParent; } pNext = pParent; } return pNext; }

四.本題考點

  1. 考查應聘者對二叉樹遍歷的理解程度。只有對二叉樹的遍歷算法有了深刻的理解,應聘者才有可能準確找出每個節點的中序遍歷的下一個節點。
  2. 考查應聘者分析復雜問題的能力。應聘者只有畫出二叉樹的結構圖、通過具體的例子找出中序遍歷的下一個節點的規律,才有可能設計出可行的算法。

面試題8:二叉樹的下一個節點