面试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");
}
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
输入:
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");
}
相关文章推荐
- 面试100题:15.求二叉树的镜像
- 【从零单排之微软面试100题系列】15之二叉树的镜像
- 微软100题(15)镜像二叉树
- 【java 面试100】15 :输入一颗二元查找树,将该树转换为它的镜像
- 二叉树的镜像 【微软面试100题 第十五题】
- 二叉树的镜像 【微软面试100题 第十五题】
- 求二叉树中结点的最大距离 【微软面试100题 第十一题】
- 微软100题15题(输入一颗二元查找树,将该树转换为它的镜像)
- 微软面试100题系列---求二叉树中节点的最大距离
- 微软等数据结构+算法面试100题(35)-- 二叉树的深度
- 微软等数据结构+算法面试100题(4)--怎样从顶部开始逐层打印二叉树结点数据?请编程
- 微软等数据结构+算法面试100题(36)-- 打印二叉树中某一层的节点
- IT公司100题-15-求二元查找树的镜像
- 【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径
- 笔试面试算法经典--二叉树的镜像-递归与非递归实现(Java)
- 剑指offer-15 二叉树的镜像
- 微软等数据结构+算法面试100题(5)--怎样编写一个程序,把一个有序整数数组放到二叉树中
- 剑指offer-4-面试19:二叉树的镜像
- 有序数组放到二叉树 【微软面试100题 第八十六题】
- 微软等数据结构+算法面试100题(15)--求最大连续递增数字串