求二元查找树的镜像 C++实现
2014-02-25 14:28
169 查看
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结
点。用递归和循环两种方法完成树的镜像转换。 例如输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
解析:非递归方式可以使用队列或栈作为辅助工具
点。用递归和循环两种方法完成树的镜像转换。 例如输入:
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 */
相关文章推荐
- builder模式 c++
- C++单态类声明
- C++体会
- C/C++中switch用法的一种替换方式
- C/C++中switch用法的一种替换方式
- C++底层读取Shp文件
- C/C++ 获取目录下的文件列表信息
- C++高性能服务框架revolver:下载、编译和工程介绍
- TOJ 2674 Java Vs C++ 字符串处理
- 在vc的cpp头部加入#define new DEBUG_NEW的作用
- POJ2236详细的解题报告(C语言版)
- C++中"std::"是什么意思?起什么作用?namespace?iostream和iostream.h的区别
- 如何c++去除string字符串首尾的\n,\r,\t,空格?
- 能让你成为更优秀程序员的10个C语言资源
- Visual C++ 编译器参数传递和命名约定——关于__cdecl和__stdcall
- 华为机试通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- c语言-扑克牌小魔术
- c语言-猜数字游戏
- python 像C语言样的函数参数引用实现..
- C语言学习——结构体