四:二叉樹的鏡像遞歸非遞歸求解

先序遍歷樹的每個結點,若遍歷到的結點有子結點。則交換它的兩個子結點。post

 

1. 遞歸求解:spa

voidMirroRecursively(BinaryTreeNode *pNode)  遞歸

隊列

    if(NULL == pNode)  it

        return; class

    if(NULL == pNode->Left && NULL== pNode->Right) 遍歷

        return; queue

     

    BinaryTreeNode *pTemp =pNode->Left;  im

    pNode->Left = pNode->Right;  top

    pNode->Right = pTemp; 

     

    if(pNode->Left) 

        MirroRecursively(pNode->Left); 

    if(pNode->Right) 

        MirroRecursively(pNode->Right); 

2. 非遞歸求解(藉助棧)

藉助於棧,先交換兩棵子樹,再求完一棵子樹的鏡像後在求還有一棵子樹的鏡像(縱向,深度優先)

voidMirrorNonRecurively(BinaryTreeNode *pNode) 

    if(NULL == pNode) 

        return; 

 

    stack<BinaryTreeNode *>stackTreeNode; 

    stackTreeNode.push(pNode); 

 

    while(stackTreeNode.size()) 

    { 

        BinaryTreeNode *pNode =stackTreeNode.top(); 

        stackTreeNode.pop(); 

 

        if(NULL != pNode->Left || NULL !=pNode->Right) 

        { //交換

            BinaryTreeNode *pTemp =pNode->Left; 

            pNode->Left =pNode->Right; 

            pNode->Right = pTemp; 

        } 

         

        if(NULL != pNode->Left) 

           stackTreeNode.push(pNode->Left); 

 

        if(NULL != pNode->Right) 

           stackTreeNode.push(pNode->Right); 

    } 

}

3. 非遞歸求解(藉助隊列)

藉助於隊列以用廣度優先的順序遍歷一遍實現逐層鏡像(橫向,廣度優先)

voidMirrorNonRecurively (BinaryTreeNode * root)

 { 

    queue< BinaryTreeNode *> q; 

    q.push(root); 


    while(!q.empty())

   { 

        BinaryTreeNode * r = q.front(); 

        q.pop(); 

        if(r->pLeft != NULL)

             q.push(r->pLeft); 

        if(r->pRight != NULL)

             q.push(r->pRight);

 

////交換

        BinaryTreeNode * temp =r->pLeft; 

        r->pLeft = r->pRight; 

        r->pRight = temp; 

    } 

}  

相關文章
相關標籤/搜索