程序员面试一百题-11-求二元查找树的镜像

版权声明:知识无界限,大家可自由转载。 https://blog.csdn.net/xidianbaby/article/details/85014002

1-题目 :
输入一棵二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。

2-思路 :
在遍历二元查找树时每访问到一个结点,交换它的左右子树。

3-代码 :

//定义二元查找树的结点
struct BSTreeNode
{
    int value;
    BSTreeNode *pLeft;
    BSTreeNode *pRight;
};

//递归实现二元查找树的镜像
void MirrorRecursively(BSTreeNode *pNode)
{
    if (!pNode)
    {
        return;
    }
    //交换该结点的左右子树
    BSTreeNode *pTemp = pNode->pLeft;
    pNode->pLeft = pNode->pRight;
    pNode->pRight = pTemp;

    //若该结点的左子树不为空,则递归翻转
    if (pNode->pLeft)
    {
        MirrorRecursively(pNode->pLeft);
    }
    //若该结点的右子树不为空,则递归翻转
    if (pNode->pRight)
    {
        MirrorRecursively(pNode->pRight);
    }
}

//循环实现二元查找树的镜像
void MirrorIteratively(BSTreeNode *pTreeHead)
{
    if (!pTreeHead)
    {
        return;
    }
    std::stack<BSTreeNode *> stackTreeNode;
    stackTreeNode.pop();

    //当栈不为空
    while (stackTreeNode.size())
    {
        //取出栈顶的结点
        BSTreeNode *pNode = stackTreeNode.top();
        stackTreeNode.pop();

        //交换该结点的左右子树
        BSTreeNode *pTemp = pNode->pLeft;
        pNode->pLeft = pNode->pRight;
        pNode->pRight = pTemp;

        //若该结点的左右子树不为空,则将其压入栈
        if (pNode->pLeft)
        {
            stackTreeNode.push(pNode->pLeft);
        }
        if (pNode->pRight)
        {
            stackTreeNode.push(pNode->pRight);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xidianbaby/article/details/85014002