翻转2元搜索树(镜像)这两种思路
2015-08-26 11:11
274 查看
问题叙述性说明:
输入搜索树2元,树被转换为它的镜面。即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
算法:
測试用例:
10
/ \
5 11
/ \
3 7
/ \ / \
2 4 6 9
/ /
1 8
算法:
有两种思路:①递归。对树翻转。仅仅需对他的左右子树翻转,再交换左右子树的位置就可以。
②非递归。设置一个队列queue,从根节点開始处理:人节点先入列,当队列非空时,循环进行下面处理:从队列中取出一节点。交换他的左右子树的位置,将它的左右子节点入列(若存在的话)。当队列为空时,返回。
代码实现:
①递归<p align="left"><pre name="code" class="cpp">template<class T> void ReverseTree(BinaryTreeNode<T>* t) { if (!t) return; BinaryTreeNode<T>* temp = new BinaryTreeNode<T>; temp = t->LeftChild; t->LeftChild = t->RightChild; t->RightChild = temp; ReverseTree(t->LeftChild); ReverseTree(t->RightChild); return; }
非递归:
//非递归 template<class T> void ReverseTree2(BinaryTreeNode<T>* t) { if (!t) return; Queue<BinaryTreeNode<T>*> q; q.Add(t); BinaryTreeNode<T>* tt = new BinaryTreeNode < T >; while (!q.IsEmpty()) { q.Delete(tt); BinaryTreeNode<T>* temp = new BinaryTreeNode < T >; temp = tt->LeftChild; tt->LeftChild = tt->RightChild; tt->RightChild = temp; if (tt->LeftChild) q.Add(tt->LeftChild); if (tt->RightChild) q.Add(tt->RightChild); } }
输出測试:
InOrder(n10); cout << endl; ReverseTree(n10); InOrder(n10); cout << endl; ReverseTree2(n10); InOrder(n10); cout << endl;
相关文章推荐
- discuz 帖子模块用到的表及自动发帖函数
- [LeetCode] Isomorphic Strings
- 语料编程空手道:从 VBA,到 VBS,到 HTA
- 转EditText inputType 常用属性
- UI_UITextFile(单行文本输入框)
- windows android JNI 使用和环境搭建
- yum 搭建LAMP
- 数码管基础知识
- C#学习资源汇总
- Extjs4---Checkbox,多选,全选
- 项目开发经验01
- C#学习资源汇总
- pomelo windows 环境下开发环境搭建
- 在MacOs上配置Mesos+Zookeeper
- 转:mysql show processlist命令 详解
- Git学习与总结三
- PS学习笔记-------“反选区操作” :Ctrl + shift +i
- 最近公共祖先(LCA)详解
- mongoDB数据库设置用户名及密码
- 在如下8*6的矩阵中,请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格,并且不能经过P。