您的位置:首页 > 职场人生

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

2014-04-22 16:46 309 查看
题目

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

输入:

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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: