[编程之美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");}



扩展题2:
如果按照深度从下访问,每层的访问顺序从右到左,即访问顺序变为:
————————————————————————————————————————————————————————————————————————————

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");}




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 蚊子钻到耳朵里怎么办 小飞虫进耳朵里怎么办 耳朵里飞进去虫怎么办 耳朵里进虫子了怎么办 耳朵进虫子了怎么办啊 耳朵里进了蚊子怎么办 有虫子爬进耳朵怎么办 虫子死在耳朵里怎么办 早上起床口苦口臭怎么办 耳朵被耳屎堵了怎么办 油耳朵被堵住了怎么办 棉签掏耳朵堵了怎么办 耳朵被气堵住了怎么办 掏耳朵发炎了疼怎么办 掏耳朵掏深了疼怎么办 耳朵里进了虫子怎么办? 耳朵里飞进小虫怎么办 一只耳朵听力差怎么办 62岁耳朵有点聋怎么办 一支耳朵有点聋怎么办 80岁老人耳朵聋怎么办 被nlp课程洗脑了怎么办 手上张了个鸡眼怎么办 手上长了个鸡眼怎么办 6岁儿童手指脱皮怎么办 手指骨折后关节僵硬怎么办 手指外伤后关节肿大僵硬怎么办 胳膊骨折了手肿怎么办 耳朵被肘了耳鸣怎么办 耳朵鼓膜外显的怎么办 耳膜破了怎么办为好 耳朵的鼓膜破了怎么办 被打耳鼓膜穿孔怎么办 两只耳朵嗡嗡响怎么办 耳朵长了个脓包怎么办 胸一个大一个小怎么办 把耳朵掏出血了怎么办 掏耳朵戳出血了怎么办 耳朵戳伤流血了怎么办 耳朵挖破出血了怎么办 耳朵让耳屎堵了怎么办