首页 > 代码库 > 11.求二元查找树的镜像

11.求二元查找树的镜像

http://zhedahht.blog.163.com/blog/static/2541117420072159363370/

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。

例如输入:

     8
    /  \
  6      10
 /\       /\
5  7    9   11

输出:

      8
    /  \
  10    6
 /\      /\
11  9  7  5

递归实现

void Swap(BSTreeNode *left,BSTreeNode *right)
{
    BSTreeNode *temp = left;
    left = right;
    right = temp;
}

///////////////////////////////////////////////////////////////////////
// Mirror a BST (swap the left right child of each node) recursively
// the head of BST in initial call
///////////////////////////////////////////////////////////////////////
void MirrorRecursively(BSTreeNode *pNode)
{
    if(pNode==NULL || (pNode->m_pLeft==NULL&&pNode->m_pRight==NULL) )
        return;

    // swap the right and left child sub-tree
    Swap(pNode->m_pLeft,pNode->m_pRight);

    // mirror left child sub-tree if not null
    if(pNode->m_pLeft)
        MirrorRecursively(pNode->m_pLeft);  

    // mirror right child sub-tree if not null
    if(pNode->m_pRight)
        MirrorRecursively(pNode->m_pRight); 
}

非递归实现:

由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。如果它有左子树,把它的左子树压入栈中;如果它有右子树,把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。参考代码如下:

///////////////////////////////////////////////////////////////////////
// Mirror a BST (swap the left right child of each node) Iteratively
// Input: pTreeHead: the head of BST
///////////////////////////////////////////////////////////////////////
void MirrorIteratively(BSTreeNode *pTreeHead)
{
    if(!pTreeHead)
        return;

    std::stack<BSTreeNode *> stackTreeNode;
    stackTreeNode.push(pTreeHead);

    while(!stackTreeNode.empty())
    {
        BSTreeNode *pNode = stackTreeNode.top();
        stackTreeNode.pop();

        // swap the right and left child sub-tree
        //BSTreeNode *pTemp = pNode->m_pLeft;
        //pNode->m_pLeft = pNode->m_pRight;
        //pNode->m_pRight = pTemp;
        Swap(pNode->m_pLeft,pNode->m_pRight);

        // push left child sub-tree into stack if not null
        if(pNode->m_pLeft)
            stackTreeNode.push(pNode->m_pLeft);

        // push right child sub-tree into stack if not null
        if(pNode->m_pRight)
            stackTreeNode.push(pNode->m_pRight);
    }
}