【二叉树】多行打印二叉树和按之字形打印二叉树
来源:互联网 发布:工作总结工作计划知乎 编辑:程序博客网 时间:2024/06/03 13:01
问题一
问题描述
从上到下按层打印二叉树,同层的从左到右打印。打印多行。
分析:可以想到层次遍历,借助队列存储结点;但是要打印成多行,所以必须设计两个变量,来表示当前打印的行的个数,和下一行打印的个数。
void PrintBinaryTree(Node* pRoot){ if (pRoot == NULL) return; queue<Node*> q; q.push(pRoot); int nextLevel = 0; int curLevel = 1; while (!q.empty()) { Node* pCur = q.front(); printf("%d ", pCur->val); if (pCur->left != NULL) { ++nextLevel; q.push(pCur->left); } if (pCur->right != NULL) { ++nextLevel; q.push(pCur->right); } q.pop(); --curLevel; //一行打印完 if (curLevel == 0) { printf("\n"); curLevel = nextLevel; nextLevel = 0; } }}
问题二
问题描述
按之字形顺序打印二叉树,即第一行从左到右,第二行从右到左,第三行从左到右。。。。
分析
按之字形顺序打印二叉树,需要两个栈,来保存,因为每一行打印的顺序不同,奇数层存储到一个栈,偶数层存储到两一个栈中。。
打印某一行节点的时,应先把下一层的节点保存到栈中
定义两个栈 s1,s2;
打印的奇数层的话,先保存左子树,再保存右子树 到s1
打印的偶数层的话,先保存右子树,再保存左子树 到s2
void Pint(Node* pRoot){ if (pRoot == NULL) return; std::stack<Node*> s[2]; //控制访问哪个栈, int cur = 0; int next = 1; s[0].push(pRoot); while (!s[0].empty() || !s[1].empty()) { Node* pNode = s[cur].top(); s[cur].pop(); printf("%d ", pNode->val); if (cur == 0) { //打印奇数层,存储下一层,先左后右 if (pNode->left != NULL) s[next].push(pNode->left); if (pNode->right != NULL) s[next].push(pNode->right); } else { //打印偶数层,存储下一层,先右后左。 if (pNode->right != NULL) s[next].push(pNode->right); if (pNode->left != NULL) s[next].push(pNode->left); } //当前层,打印完 if (s[cur].empty()) { printf("\n"); //感觉设计特的巧 cur = 1 - cur; next = 1 - next; } }}
阅读全文
0 0
- 【二叉树】多行打印二叉树和按之字形打印二叉树
- 之字形打印二叉树
- 之字形打印二叉树
- 之字形打印二叉树
- 之字形打印二叉树
- 按之字形打印二叉树
- 按之字形打印二叉树
- 按之字形打印二叉树
- 按照之字形打印二叉树
- 二叉树------之字形打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 牛客网 | 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 按之字形顺序打印二叉树
- 暑假集训日记--8.11--二分+单调队列
- 构建一个数组
- 将十进制ip地址转化为字符串点分十进制ip地址
- 值 引用 指针作为参数传递
- 【NOIP2017提高A组模拟8.10】文本编辑器
- 【二叉树】多行打印二叉树和按之字形打印二叉树
- 约瑟夫游戏
- NIO学习笔记(一)——NIO的特点介绍
- 字符串的全排列和所有组合问题
- JAVA中用Map实现账户登录
- mariadb配置
- FPGA实现SD卡音乐播放
- linux之用openssl命令Base64编码解码、md5/sha1摘要、AES/DES3加密解密
- 第一章:1.1.2 信号分类