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

来源:互联网 发布:ae auto sway mac 编辑:程序博客网 时间:2024/06/06 12:22

转载并参考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:    gocodeDate:        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");}

原创粉丝点击