二叉查找树的分层遍历输出和镜像
2013-03-12 15:00
288 查看
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 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 };
#include <iostream> #include <queue> using namespace std; struct BSTreeNode { int m_Value; BSTreeNode * m_Left; BSTreeNode * m_Right; BSTreeNode(int v):m_Value(v),m_Left(NULL),m_Right(NULL){} }; class Tree { private: BSTreeNode * root; int size; queue<BSTreeNode *> Q; public: BSTreeNode * getroot() { return this -> root; } Tree(){ root = NULL; size = 0; } void insert(int n) { insertfact(n,this->root); } void insertfact(int n,BSTreeNode * ¤t){ // 这里 insert调用insertfact 减小接口。insertfact主要是为了递归 (* ¤t 的引用的理解
)
//即,把当前变量取一个别名,current->p_Left ==NULL 重新赋值也是可以的 if(current == NULL) { current = new BSTreeNode(n); size ++; } else { if( current != NULL) { if(current -> m_Value > n) { insertfact(n, current -> m_Left ); } else if(current -> m_Value < n) { insertfact(n,current->m_Right); } else { cout << "insert multi value!"<<endl; return; } } else { current = new BSTreeNode(n); size ++; } } } void printlevel() { if(root != NULL) Q.push(root); while(!Q.empty()) { BSTreeNode * now = NULL; int level = Q.size(); while(level > 0) { level --; now = Q.front(); Q.pop(); cout << now -> m_Value << " "; if(now->m_Left != NULL) Q.push(now->m_Left); if(now->m_Right != NULL) Q.push(now->m_Right); } cout << endl; } }
void MirrofXun() { S.push(root); while(S.size()) { BSTreeNode * top = S.top(); S.pop(); Swap(top->m_Left,top->m_Right); if(top->m_Left != NULL) S.push(top->m_Left); if(top->m_Right != NULL) S.push(top->m_Right); } } }; int main() { Tree myTree; int a[] = {8,6,10,5,7,9,11}; for(int i = 0;i < 7;i++) { myTree.insert(a[i]); } myTree.printlevel(); }
由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。如果它有左子树,把它的左子树压入栈中;如果它有右子树,把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。
相关文章推荐
- 分层遍历二叉树,每层输出为一行
- 分层遍历二叉树,每层输出为一行
- C++层次遍历创建完全二叉树及四种遍历输出
- jquery获取table,遍历输出tr中各个td的内容(转载)
- 由后序遍历结果构造二叉查找树 && 二叉查找树链表化
- 二叉树的层次遍历,从上到下和从下到上分层打印
- 【Lua】遍历目录结果输出到页面中,刷新页面后出现500 Internal Server Error
- [程序员面试题精选100题]11.求二叉查找树的镜像
- 利用遍历思想求解图问题(输出所有路径)
- Linux C :遍历输出指定目录下的所有文件, 及st_mode判断文件类型
- 根据先序遍历和中序遍历输出层次遍历的结果
- 按行输出,之字形输出,翻转二叉树----层次遍历的应用
- PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
- 利用二叉查找树处理数据-加载、存储、插入、删除、修改、输出
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
- 按层遍历打印二叉树(分层) -- 漫漫算法路 刷题篇
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 《算法导论》第12章 二叉查找树 (1)遍历
- [编程之美3.10]分层遍历二叉树
- C语言 二叉查找树镜像