面试100题:15.求二叉树的镜像

转载并参考July的博客http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html,万分感谢!

题目

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

输入:

        8

     /    \

   6     10

 /  \     /  \

5   7   9   11

输出:

        8

    /       \

  10       6

 /   \      / \

11   9   7   5

分析

利用递归遍历二叉树的左右子树,分别交换左右孩子。

/*Title:    15.求二叉树的镜像
Author:    gocode
Date:        2012-10-16*/
 
#include <iostream>
#include <stack>
using namespace std;
 
typedef struct Node
{
    int m_Data;
    Node* m_pLeft;
    Node* m_pRight;
} Node, BSTNode;
 
BSTNode* Root;
 
// 递归求镜像
void SeekBSTMirror(BSTNode* root)
{
    if(NULL == root)
        return;
    if(NULL != root->m_pLeft)
        SeekBSTMirror(root->m_pLeft);
    if(NULL != root->m_pRight)
        SeekBSTMirror(root->m_pRight);
 
    // 左右孩子交换
    if(NULL != root->m_pLeft && NULL != root->m_pRight)
    {
        BSTNode* tempNode = root->m_pLeft;
        root->m_pLeft = root->m_pRight;
        root->m_pRight = tempNode;
    }
 
    // 左叶子变右叶子
    if(NULL != root->m_pLeft && NULL == root->m_pRight)
    {
        BSTNode* pNewRightNode = new BSTNode();
        pNewRightNode = root->m_pLeft;
        root->m_pLeft = NULL;
        delete root->m_pLeft;
        root->m_pRight = pNewRightNode;
    }
 
    // 右叶子变左叶子
    if(NULL == root->m_pLeft && NULL != root->m_pRight)
    {
        BSTNode* pNewLeftNode = new BSTNode();
        pNewLeftNode = root->m_pRight;
        root->m_pRight = NULL;
        delete root->m_pRight;
        root->m_pLeft = pNewLeftNode;
    }
}
 
// 循环求镜像
BSTNode* SeekBSTMirror2(BSTNode* root)
{
    if(root != NULL) 
    { 
        stack<BSTNode *> stk;   //辅助栈  
        stk.push(root);           //压入根结点  
        while(stk.size()) 
        { 
            BSTNode *pNode = stk.top(); 
            BSTNode *pLeft = pNode->m_pLeft; 
            BSTNode* pRight = pNode->m_pRight; 
            stk.pop(); 
 
            if(pLeft != NULL) 
                stk.push(pLeft); 
            if(pRight != NULL) 
                stk.push(pRight); 
            pNode->m_pLeft = pRight;  //交换左右子女  
            pNode->m_pRight = pLeft; 
        } 
    } 
    return root;
}
 
// 创建二叉树
void AddBSTNode(BSTNode* &pCur, int key)
{
    if(NULL == pCur)
    {
        pCur = new BSTNode();
        pCur->m_Data = key;
        pCur->m_pLeft = NULL;
        pCur->m_pRight = NULL;
    }
    else if(key < pCur->m_Data)
        AddBSTNode(pCur->m_pLeft, key);
    else if(key > pCur->m_Data)
        AddBSTNode(pCur->m_pRight, key);
    else
        cout<<"Duplicate node is not allowed."<<endl;
}
 
// 中序遍历并打印二叉树结点
void DisplayBST(BSTNode* &root)
{
    if(NULL == root)
        return;
 
    if(NULL != root->m_pLeft)
        DisplayBST(root->m_pLeft);
 
    cout<<root->m_Data<<" ";
 
    if(NULL != root->m_pRight)
        DisplayBST(root->m_pRight);
}
 
void main()
{
    BSTNode* myRoot = NULL;
    AddBSTNode(myRoot, 8);
    AddBSTNode(myRoot, 6);
    AddBSTNode(myRoot, 10);
    AddBSTNode(myRoot, 5);
    AddBSTNode(myRoot, 7);
    AddBSTNode(myRoot, 9);
    AddBSTNode(myRoot, 11);
 
    cout<<"Original BST: "<<endl;
    DisplayBST(myRoot);
    cout<<endl<<"Solution 1 : recursion"<<endl;
    SeekBSTMirror(myRoot);
    DisplayBST(myRoot);
    cout<<endl<<"Solution 2: circulation"<<endl;
    SeekBSTMirror2(myRoot);
    DisplayBST(myRoot);
    cout<<endl;
    system("pause");
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值