二叉树按层遍历并按层打印和蛇形打印
来源:互联网 发布:无主之地2网络联机 编辑:程序博客网 时间:2024/06/06 20:47
点:技巧性问题
题意:一个二叉树按层的遍历和按层打印
常见面试题
思路:二叉树按层遍历和打印有很多办法,无外乎各种方式做到按层暂存并暂存该层的下一层节点,这样不停的直到树结尾
我的思路是用2个队列,队列1保存当前层节点,队列2保存当前层下一层的节点,从左节点的左子节点开始,这是对应有些面试题要求保证输出的顺序是从左至右,以及蛇形打印之类的题。
1、按顺序从左到右打印:既然顺序都是从左到右,那么用队列较适合,队列1保存当前层节点用于打印,在遍历打印当前层节点的同时,从左至右依次记录各个节点的左右子节点到队列2,遍历打印完当前层,队列2数据再录入队列1,这样直到队列2不再存在节点
2、按层蛇形打印:用一个栈和一个队列实现,根节点第一层用栈,依次从左到右记录左右子节点到队列,然后第二层队列,依次从左到右记录左右子节点到栈,第三层再用栈.......直到某一层的栈或队列没有再被填充数据为空时,蛇形遍历结束
代码:
#include <iostream>#include <random>#include <queue>#include <stack>template<class T> struct Node { T val; Node<T> *lchild; Node<T> *rchild; Node(T _val):val(_val), lchild(nullptr), rchild(nullptr) {}};template<class T> class Btree { Node<T> *root;public: Btree ():root(nullptr) {} void Free (Node<T> *cur) { if (cur) { Free(cur->lchild); Free(cur->rchild); delete cur; cur = nullptr; } } ~Btree () { Free(root); } void Add (T val) { if (!root) { root = new Node<T>(val); } else { Node<T> *cur = root; while (cur) { if (cur->val > val) { if (cur->lchild) { cur = cur->lchild; } else { cur->lchild = new Node<T>(val); break; } } else if (cur->val < val) { if (cur->rchild) { cur = cur->rchild; } else { cur->rchild = new Node<T>(val); break; } } else { break; } } } } void level_traverse () { if (!root) { return; } std::queue<Node<T> *> q1, q2; Node<T> *cur = root; q1.push(cur); while (!q1.empty()) { while (!q1.empty()) { std::cout << q1.front()->val << "\t"; if (q1.front()->lchild) { q2.push(q1.front()->lchild); } if (q1.front()->rchild) { q2.push(q1.front()->rchild); } q1.pop(); } std::cout << std::endl; while (!q2.empty()) { q1.push(q2.front()); q2.pop(); } } } void shexing_traverse () { std::stack<Node<T> *> stk; std::queue<Node<T> *> q; Node<T> *cur = root; stk.push(cur); bool flag = false; while (1) { if (!flag) { while (!stk.empty()) { std::cout << stk.top()->val << "\t"; if (stk.top()->lchild) { q.push(stk.top()->lchild); } if (stk.top()->rchild) { q.push(stk.top()->rchild); } stk.pop(); } flag = flag?false:true; std::cout << std::endl; if (q.empty()) { break; } } else { while (!q.empty()) { std::cout << q.front()->val << "\t"; if (q.front()->lchild) { stk.push(q.front()->lchild); } if (q.front()->rchild) { stk.push(q.front()->rchild); } q.pop(); } flag = flag?false:true; std::cout << std::endl; if (stk.empty()) { break; } } } }};int main () { std::random_device rd; Btree<int> bt; for (int i = 0; i < 15; i++) { int cur = rd() % 100; std::cout << cur << "\t"; bt.Add(cur); } std::cout << std::endl; bt.level_traverse(); bt.shexing_traverse(); return 0;}
阅读全文
0 0
- 二叉树按层遍历并按层打印和蛇形打印
- 蛇形打印二叉树
- 蛇形打印二叉树
- 二叉树的按层打印和ZigZag打印
- 按层打印二叉树的节点【层次遍历变形】
- 二叉树的遍历以及按层打印
- 【二叉树】分层遍历二叉树和打印二叉树第k层节点
- 二叉树层级遍历并按行打印
- 按照层次遍历并打印二叉树
- 按层打印二叉树
- 按层打印二叉树
- 按层打印二叉树
- 按层打印二叉树
- 按层打印二叉树
- 按层打印二叉树
- 二叉树按层遍历打印换行
- 二叉树问题---二叉树的按层打印和ZigZag打印
- 二叉树3:二叉树按层遍历打印
- 查一波排序算法
- soj:3300_背包装满(完全背包)
- POJ 3320 Jessica's Reading Problem
- windows下redis的安装
- WINDOWS -Eclipse 配置PyDev
- 二叉树按层遍历并按层打印和蛇形打印
- 一次SSH免密登陆的问题
- Cannot interpret feed_dict key as Tensor: Can not convert a method into a Tensor.
- flume【源码分析】分析Flume的拦截器
- Android-邮箱验证
- 安卓手机安装软件提示存储空间不足的解决方法
- js 提交 乱码解决
- 如何防止跨站点脚本攻击
- HTML进阶