您的位置:首页 > 编程语言 > C语言/C++

求二元查找树的镜像 C++实现

2014-02-25 14:28 169 查看
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结

点。用递归和循环两种方法完成树的镜像转换。 例如输入:

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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: