二元查找树转换为它的镜像

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

要求:用递归和循环两种方法完成树的镜像转换。

举例:

        8                     8
      /   \       转换       /   \
     6     10     -->      10    6
    /  \   / \            /  \   / \
   5    7 9   11         11   9 7   5

二叉树定义的结点为:

struct BSTreeNode
{
    int m_nValue;
    BSTreeNode *m_pLeft;
    BSTreeNode *m_pRight;
};

答:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

/*      8                     8
      /   \       转换       /   \
     6     10     -->      10    6
     /  \   / \            /  \   / \
   5    7 9   11         11   9 7   5
*/

struct BSTreeNode
{
    int m_nValue;
    BSTreeNode *m_pLeft;
    BSTreeNode *m_pRight;
};

//递归转换
void RecursionConversion(BSTreeNode *&pRoot)
{
    if (NULL == pRoot)
    {
        return;
    }
    BSTreeNode *pTmp = pRoot->m_pLeft;
    pRoot->m_pLeft = pRoot->m_pRight;
    pRoot->m_pRight = pTmp;

    if (NULL != pRoot->m_pLeft)
    {
        RecursionConversion(pRoot->m_pLeft);
    }

    if (NULL != pRoot->m_pRight)
    {
        RecursionConversion(pRoot->m_pRight);
    }
}

//非递归转换
void Conversion(BSTreeNode *&pRoot)
{
    if (NULL == pRoot)
    {
        return;
    }
    stack<BSTreeNode*> s;
    BSTreeNode *pNode = pRoot;
    BSTreeNode *pTmp = NULL;
    s.push(pNode);
    while (!s.empty())
    {
        pNode = s.top();
        s.pop();
        pTmp = pNode->m_pLeft;
        pNode->m_pLeft = pNode->m_pRight;
        pNode->m_pRight = pTmp;

        if (NULL != pNode->m_pLeft)
        {
            s.push(pNode->m_pLeft);
        }
        if (NULL != pNode->m_pRight)
        {
            s.push(pNode->m_pRight);
        }
    }
}

//辅助函数
//创建二元二叉树
void CreateBitree(BSTreeNode *&pNode, fstream &fin)
{
    int dat;
    fin>>dat;
    if(dat==0)
    {
        pNode = NULL;
    }
    else 
    {
        pNode = new BSTreeNode();
        pNode->m_nValue=dat;      
        CreateBitree(pNode->m_pLeft, fin);      
        CreateBitree(pNode->m_pRight, fin);
    }
}

//前序递归遍历
void PreRecurTraversal(BSTreeNode *pRoot)
{
    if (NULL != pRoot)
    {
        cout<<pRoot->m_nValue<<'\t';
        PreRecurTraversal(pRoot->m_pLeft);
        PreRecurTraversal(pRoot->m_pRight);
    }
}

//中序递归遍历
void MidRecurTraversal(BSTreeNode *pRoot)
{
    if (NULL != pRoot)
    {
        MidRecurTraversal(pRoot->m_pLeft);
        cout<<pRoot->m_nValue<<'\t';
        MidRecurTraversal(pRoot->m_pRight);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    fstream fin("tree.txt");
    BSTreeNode *pRoot = NULL;
    CreateBitree(pRoot, fin);
    cout<<"**********转换前的前序和中序遍历***********"<<endl;
    cout<<"前序: ";
    PreRecurTraversal(pRoot);
    cout<<endl<<"后序: ";
    MidRecurTraversal(pRoot);

    RecursionConversion(pRoot);
    cout<<endl<<"********递归转换后的前序和中序遍历*********"<<endl;
    cout<<"前序: ";
    PreRecurTraversal(pRoot);
    cout<<endl<<"后序: ";
    MidRecurTraversal(pRoot);

    Conversion(pRoot);
    cout<<endl<<"*******非递归转换后的前序和中序遍历********"<<endl;
    cout<<"前序: ";
    PreRecurTraversal(pRoot);
    cout<<endl<<"后序: ";
    MidRecurTraversal(pRoot);

    cout<<endl;
    return 0;
}

运行界面如下:

建造二叉树用到的tree.txt为:

8 6 5 0 0 7 0 0 10 9 0 0 11 0 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值