题目:
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
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
};
解题思路:
利用二叉树后序遍历的性质,对叶子节点进行翻转。
代码如下:
#include <iostream>
#include <string.h>
using namespace std;
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
};
void BuildTree(BSTreeNode *&Node,int n) //建立二叉树
{
if(Node == NULL)
{
BSTreeNode *NewNode = new BSTreeNode();
NewNode->m_nValue = n;
NewNode->m_pLeft = NULL;
NewNode->m_pRight = NULL;
Node = NewNode;
}
else if(Node->m_nValue < n)
{
BuildTree(Node->m_pRight,n);
}
else
{
BuildTree(Node->m_pLeft,n);
}
}
void Convert(BSTreeNode *&Node) //进行镜像转换
{
if(Node == NULL)
return ;
Convert(Node->m_pLeft);
Convert(Node->m_pRight);
BSTreeNode *Temp = Node->m_pLeft;
Node->m_pLeft = Node->m_pRight;
Node->m_pRight = Temp;
}
void OutPut(BSTreeNode *&Node) //前序遍历输出树
{
if(Node == NULL)
return ;
cout<<Node->m_nValue<<" ";
OutPut(Node->m_pLeft);
OutPut(Node->m_pRight);
}
int main()
{
BSTreeNode *Node = NULL;
BuildTree(Node,8);
BuildTree(Node,6);
BuildTree(Node,10);
BuildTree(Node,5);
BuildTree(Node,7);
BuildTree(Node,9);
BuildTree(Node,11);
OutPut(Node); //镜像转换前前序输出树
cout<<endl;
Convert(Node); //镜像转换
OutPut(Node); //镜像转换后前序输出树
cout<<endl;
return 0;
}