[编程之美3.10]分层遍历二叉树
来源:互联网 发布:青花瓷歌词 知乎 编辑:程序博客网 时间:2024/04/29 11:25
题目1描述:给定一棵二叉树,要求分层遍历该二叉树,即从上到下按层次访问该二叉树(每层将单独输出一行),每层要求访问的顺序从左到右,并将节点依次编号。正确输出为:
—————————————————————————————————————————————————————————————————————————————
1
2 3
4 5 6
7 8
—————————————————————————————————————————————————————————————————————————————
#include <iostream>#include <vector>using namespace std;struct Node{Node * pLeft;Node * pRight;int value;Node(int v) : value(v), pLeft(NULL), pRight(NULL){}};voidPrintNodeByLevel(Node * root){vector<Node *>vec;intcur = 0;intlast = 1;if(root == NULL)return ;vec.push_back(root);while(cur < vec.size()){last = vec.size();while(cur < last){cout << vec[cur]->value << " ";if(vec[cur]->pLeft != NULL)vec.push_back(vec[cur]->pLeft);if(vec[cur]->pRight != NULL)vec.push_back(vec[cur]->pRight);cur++;}cout << endl;}cout << endl;}int main(){Node* root = new Node(1); Node* tmp = new Node(2); root->pLeft = tmp; tmp = new Node(3); root->pRight = tmp; tmp = new Node(4); root->pLeft->pLeft = tmp; tmp = new Node(5); root->pLeft->pRight = tmp; tmp = new Node(6); root->pRight->pRight = tmp; tmp = new Node(7); root->pLeft->pRight->pLeft = tmp; tmp = new Node(8); root->pLeft->pRight->pRight = tmp;PrintNodeByLevel(root);system("pause");}
扩展题1:
如果要求按深度从下到上访问图中的二叉树,每层的访问顺序仍然是从左到右,即访问顺序变为:
—————————————————————————————————————————————————————————————————————————————
7 8
4 5 6
2 3
1
—————————————————————————————————————————————————————————————————————————————
#include <iostream>#include <vector>using namespace std;struct Node{Node * pLeft;Node * pRight;int value;Node(int v) : value(v), pLeft(NULL), pRight(NULL){}};voidPrintNodeByLevel(Node * root){vector<Node *>vec;intcur = 0;intlast = 1;if(root == NULL)return ;vec.push_back(root);while(cur < vec.size()){last = vec.size();vec.push_back(NULL);while(cur < last){if(vec[cur]->pLeft != NULL)vec.push_back(vec[cur]->pLeft);if(vec[cur]->pRight != NULL)vec.push_back(vec[cur]->pRight);cur++;}cur++;}for(vector<Node*>::const_reverse_iterator iter = vec.rbegin() + 1; iter != vec.rend(); iter++){if(*iter == NULL )cout << endl;elsecout << (*iter)->value << " ";}cout << endl;}int main(){Node* root = new Node(1); Node* tmp = new Node(2); root->pLeft = tmp; tmp = new Node(3); root->pRight = tmp; tmp = new Node(4); root->pLeft->pLeft = tmp; tmp = new Node(5); root->pLeft->pRight = tmp; tmp = new Node(6); root->pRight->pRight = tmp; tmp = new Node(7); root->pLeft->pRight->pLeft = tmp; tmp = new Node(8); root->pLeft->pRight->pRight = tmp;PrintNodeByLevel(root);system("pause");}
8 7
6 5 4
3 2
1
————————————————————————————————————————————————————————————————————————————
解法代码如下:
#include <iostream>#include <vector>using namespace std;struct Node{Node * pLeft;Node * pRight;int value;Node(int v) : value(v), pLeft(NULL), pRight(NULL){}};voidPrintNodeByLevel(Node * root){vector<Node *>vec;intcur = 0;intlast = 1;if(root == NULL)return ;vec.push_back(root);while(cur < vec.size()){last = vec.size();vec.push_back(NULL);while(cur < last){if(vec[cur]->pRight != NULL)vec.push_back(vec[cur]->pRight);if(vec[cur]->pLeft != NULL)vec.push_back(vec[cur]->pLeft);cur++;}cur++;}for(vector<Node*>::const_reverse_iterator iter = vec.rbegin() + 1; iter != vec.rend(); iter++){if(*iter == NULL )cout << endl;elsecout << (*iter)->value << " ";}cout << endl;}int main(){Node* root = new Node(1); Node* tmp = new Node(2); root->pLeft = tmp; tmp = new Node(3); root->pRight = tmp; tmp = new Node(4); root->pLeft->pLeft = tmp; tmp = new Node(5); root->pLeft->pRight = tmp; tmp = new Node(6); root->pRight->pRight = tmp; tmp = new Node(7); root->pLeft->pRight->pLeft = tmp; tmp = new Node(8); root->pLeft->pRight->pRight = tmp;PrintNodeByLevel(root);system("pause");}
扩展题3:(参照leetcode中的Binary Tree Zigzag Level Order Traversal)
若访问顺序为:
————————————————————————————————————————————————————————————————————————————
1
3 2
4 5 6
8 7
————————————————————————————————————————————————————————————————————————————
#include <iostream>#include <vector>using namespace std;struct Node{Node * pLeft;Node * pRight;int value;Node(int v) : value(v), pLeft(NULL), pRight(NULL){}};voidPrintNodeByLevel(Node * root){vector<Node *>vec;vector<vector<int> > result;vector<int>val;intcur = 0;intlast = 1;if(root == NULL)return ;vec.push_back(root);bool order = false;while(cur < vec.size()){last = vec.size();while(cur < last){val.push_back(vec[cur]->value);if(vec[cur]->pLeft != NULL)vec.push_back(vec[cur]->pLeft);if(vec[cur]->pRight != NULL)vec.push_back(vec[cur]->pRight);cur++;}order = !order;if(!order)reverse(val.begin(),val.end());result.push_back(val);val.clear();}for(vector<vector<int> >::iterator iter = result.begin(); iter != result.end(); iter++){for(vector<int>::iterator cr = (*iter).begin(); cr != (*iter).end(); cr++)cout << *cr << " ";cout << endl;}}int main(){Node* root = new Node(1); Node* tmp = new Node(2); root->pLeft = tmp; tmp = new Node(3); root->pRight = tmp; tmp = new Node(4); root->pLeft->pLeft = tmp; tmp = new Node(5); root->pLeft->pRight = tmp; tmp = new Node(6); root->pRight->pRight = tmp; tmp = new Node(7); root->pLeft->pRight->pLeft = tmp; tmp = new Node(8); root->pLeft->pRight->pRight = tmp;PrintNodeByLevel(root);system("pause");}
- 编程之美:分层遍历二叉树
- 编程之美---分层遍历二叉树
- 分层遍历二叉树-编程之美
- 编程之美-----分层遍历二叉树
- [编程之美]分层遍历二叉树
- [编程之美] 分层遍历二叉树
- 编程之美--分层遍历二叉树
- 编程之美-分层遍历二叉树
- 编程之美 - 分层遍历二叉树
- 读书笔记之编程之美 - 3.10 分层遍历二叉树
- 编程之美读书笔记3:3.10分层遍历二叉树
- 《编程之美》 3.10 分层遍历二叉树
- 编程之美——3.10 分层遍历二叉树
- [编程之美3.10]分层遍历二叉树
- 编程之美3.10 分层遍历二叉树
- 编程之美 3.10: 分层遍历二叉树
- 3.10- 编程之美-----分层遍历二叉树
- 编程之美--3.10 分层遍历二叉树
- JDBC连接各种数据库的区别
- hdu 1181 变形课
- 10个PHP开发者常犯的MySQL错误
- android不能产生R.java的解决办法总结
- 黑马程序员——抽象类 abstract class,接口 interface,Object类
- [编程之美3.10]分层遍历二叉树
- android开发_TimePicker控件
- 理解 LDA
- 如何在Eclipse下查看JDK源代码
- Javascript之dom解析
- 你所应该知道的Dom4J
- Dinner Hall
- MFC每日一练之《创建modal对话框和非modal对话框》
- 百度地图之一百度地图搭建开发环境(老罗视频笔记整理)