题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
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
};
----------------------------------
今天这两道题相对来说还是比较简单,怪不得连答案都没咯
镜像,就是交换左右子树,正如我前面题目里遇到的一样,二叉树这种问题最便捷的就是回归到递归遍历问题上,这样解题就思路开阔了
//============================================================================
// Name : RevertBT.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
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 addNode(BSTreeNode* &p, int value);
void printLDR(BSTreeNode* p);
void Mirror(BSTreeNode* p);
int main() {
BSTreeNode *head = NULL;
int input = 0;
while(true){
cin>>input;
if(input != -1)
addNode(head, input);
else
break;
}
printLDR(head);
cout<<endl;
Mirror(head);
printLDR(head);
return 0;
}
void addNode(BSTreeNode* &p, int value){
if(p == NULL){
BSTreeNode* temp = new BSTreeNode();
temp->m_nValue = value;
temp->m_pLeft = NULL;
temp->m_pRight = NULL;
p = temp;
}else{
if(value < p->m_nValue)
addNode(p->m_pLeft, value);
else{
addNode(p->m_pRight, value);
}
}
}
/*
* 翻转镜像
*/
void Mirror(BSTreeNode* p){
if(p == NULL)
return;
//先镜像
BSTreeNode* temp = p->m_pLeft;
p->m_pLeft = p->m_pRight;
p->m_pRight = temp;
//再遍历
Mirror(p->m_pLeft);
Mirror(p->m_pRight);
}
/*
* 中序遍历
*/
void printLDR(BSTreeNode* p){
if(p == NULL)
return;
printLDR(p->m_pLeft);
cout<<p->m_nValue<<" ";
printLDR(p->m_pRight);
}