输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结
点。用递归和循环两种方法完成树的镜像转换。 例如输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
解析:非递归方式可以使用队列或栈作为辅助工具
//============================================================================
// Name : ExchangeChildrenOfTree.cpp
// Author : Lee
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include<vector>
#include<deque>
using namespace std;
class Node {
public:
int data;
Node * left;
Node * right;
Node() :
data(0), left(NULL), right(NULL) {
}
};
class Tree {
private:
Node * tree;
vector<int> vec;
deque<Node *> deq;
Node * createTree(Node * node);
void viewTree(Node * tree); //中序遍历
void exchangeByRec(Node * tree);
void exchangeByLoop(Node * tree);
public:
Tree() :
tree(NULL) {
}
void exchangeByRec() {
exchangeByRec(tree);
}
void exchangeByLoop() {
exchangeByLoop(tree);
}
void getTree() {
viewTree(tree);
}
void setTree();
};
void Tree::exchangeByRec(Node * tree) {
Node * temp = tree->left;
tree->left = tree->right;
tree->right = temp;
if (tree->left != NULL) {
exchangeByRec(tree->left);
}
if (NULL != tree->right) {
exchangeByRec(tree->right);
}
}
void Tree::exchangeByLoop(Node * tree) {
deq.push_back(tree);
while (deq.size() != 0) {
Node * node = deq.front();
deq.pop_front();
Node * temp = node->left;
node->left = node->right;
node->right = temp;
if (NULL != node->left) {
deq.push_back(node->left);
}
if (NULL != node->right) {
deq.push_back(node->right);
}
}
}
void Tree::setTree() {
tree = createTree(tree);
}
Node * Tree::createTree(Node * node) {
int data = 0;
cin >> data;
if (0 != data) {
node = new Node();
node->data = data;
} else {
return NULL;
}
node->left = createTree(node->left);
node->right = createTree(node->right);
return node;
}
void Tree::viewTree(Node * tree) {
if (tree->left != NULL) {
viewTree(tree->left);
}
cout << tree->data << endl;
if (tree->right != NULL) {
viewTree(tree->right);
}
}
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
Tree tree;
tree.setTree();
tree.getTree();
tree.exchangeByRec();
cout << "after exchange by recursion" << endl;
tree.getTree();
tree.exchangeByLoop();
cout << "after exchange by Loop" << endl;
tree.getTree();
return 0;
}
/*
3
2
-2
0
3
0
0
1
0
0
4
0
0
*/