题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ /
6 10
// //
5 7 9 11
输出:
8
/ /
10 6
// //
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
//coder:LEE
//20120227
#include<iostream>
#include<CASSERT>
#include<QUEUE>
#include<Stack>
using namespace std;
struct BSTreeNode
{
int m_nValue;
BSTreeNode* m_pLeft;
BSTreeNode * m_pRight;
};
void AddNode(BSTreeNode *& root,int n)
{
if (!root)
{
root=(BSTreeNode *)malloc(sizeof(BSTreeNode ));
root->m_nValue=n;
root->m_pLeft=NULL;
root->m_pRight=NULL;
return;
}
if(n<root->m_nValue)
AddNode(root->m_pLeft,n);
else
AddNode(root->m_pRight,n);
}
void Traverse(BSTreeNode * root)
{
if(!root)
return;
Traverse((root->m_pLeft));
cout<<root->m_nValue<<" ";
Traverse(root->m_pRight);
}
void Swap(BSTreeNode *&a,BSTreeNode *&b)
{
BSTreeNode *t;
t=a;
a=b;
b=t;
}
void MirrorBiTree(BSTreeNode *&root)
{
if(!root)
return;
MirrorBiTree(root->m_pLeft);
MirrorBiTree(root->m_pRight);
Swap(root->m_pLeft,root->m_pRight);
}
void MirrorBiTreeWithQueue(BSTreeNode *root)
{
assert(root!=NULL);
queue <BSTreeNode *> q;
q.push(root);
while(!q.empty())
{
BSTreeNode *pCur=q.front();
q.pop();
if(pCur->m_pLeft!=NULL)
q.push(pCur->m_pLeft);
if(pCur->m_pRight!=NULL)
q.push(pCur->m_pRight);
Swap(pCur->m_pLeft,pCur->m_pRight);
}
}
void PreDisplayBiTreeWithStack(BSTreeNode *root)
{
assert(root!=NULL);
stack <BSTreeNode *> s;
s.push(root);
while(!s.empty())
{
BSTreeNode *pCur=s.top();
s.pop();
if(pCur->m_pRight!=NULL)
s.push(pCur->m_pRight);
if(pCur->m_pLeft!=NULL)
s.push(pCur->m_pLeft);
Swap(pCur->m_pLeft,pCur->m_pRight);
}
}
int main()
{
BSTreeNode * root=NULL;
AddNode(root,8);
AddNode(root,6);
AddNode(root,10);
AddNode(root,5);
AddNode(root,7);
AddNode(root,9);
AddNode(root,11);
Traverse(root);
cout<<endl;
PreDisplayBiTreeWithStack(root);
// MirrorBiTreeWithQueue(root);
cout<<endl;
Traverse(root);
return 0;
}
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ /
6 10
// //
5 7 9 11
输出:
8
/ /
10 6
// //
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
//coder:LEE
//20120227
#include<iostream>
#include<CASSERT>
#include<QUEUE>
#include<Stack>
using namespace std;
struct BSTreeNode
{
int m_nValue;
BSTreeNode* m_pLeft;
BSTreeNode * m_pRight;
};
void AddNode(BSTreeNode *& root,int n)
{
if (!root)
{
root=(BSTreeNode *)malloc(sizeof(BSTreeNode ));
root->m_nValue=n;
root->m_pLeft=NULL;
root->m_pRight=NULL;
return;
}
if(n<root->m_nValue)
AddNode(root->m_pLeft,n);
else
AddNode(root->m_pRight,n);
}
void Traverse(BSTreeNode * root)
{
if(!root)
return;
Traverse((root->m_pLeft));
cout<<root->m_nValue<<" ";
Traverse(root->m_pRight);
}
void Swap(BSTreeNode *&a,BSTreeNode *&b)
{
BSTreeNode *t;
t=a;
a=b;
b=t;
}
void MirrorBiTree(BSTreeNode *&root)
{
if(!root)
return;
MirrorBiTree(root->m_pLeft);
MirrorBiTree(root->m_pRight);
Swap(root->m_pLeft,root->m_pRight);
}
void MirrorBiTreeWithQueue(BSTreeNode *root)
{
assert(root!=NULL);
queue <BSTreeNode *> q;
q.push(root);
while(!q.empty())
{
BSTreeNode *pCur=q.front();
q.pop();
if(pCur->m_pLeft!=NULL)
q.push(pCur->m_pLeft);
if(pCur->m_pRight!=NULL)
q.push(pCur->m_pRight);
Swap(pCur->m_pLeft,pCur->m_pRight);
}
}
void PreDisplayBiTreeWithStack(BSTreeNode *root)
{
assert(root!=NULL);
stack <BSTreeNode *> s;
s.push(root);
while(!s.empty())
{
BSTreeNode *pCur=s.top();
s.pop();
if(pCur->m_pRight!=NULL)
s.push(pCur->m_pRight);
if(pCur->m_pLeft!=NULL)
s.push(pCur->m_pLeft);
Swap(pCur->m_pLeft,pCur->m_pRight);
}
}
int main()
{
BSTreeNode * root=NULL;
AddNode(root,8);
AddNode(root,6);
AddNode(root,10);
AddNode(root,5);
AddNode(root,7);
AddNode(root,9);
AddNode(root,11);
Traverse(root);
cout<<endl;
PreDisplayBiTreeWithStack(root);
// MirrorBiTreeWithQueue(root);
cout<<endl;
Traverse(root);
return 0;
}