编程之美:层次遍历二叉树若干问题
来源:互联网 发布:手机网络投资理财收益 编辑:程序博客网 时间:2024/06/07 14:59
1.层次遍历
不多说,很简单
2.按深度从下到到上分层遍历二叉树
用栈保存每层即可
#include <iostream>#include<algorithm>#include<queue>#include<stack>using namespace std;struct node{int value;node* left;node* right;node() :left(NULL), right(NULL){}};void printNodeByLevelDowntoUp(node* root){if (root == NULL)return;stack<vector<int> >stk;queue<node*> Q;Q.push(root);Q.push(NULL);vector<int> level;while (!Q.empty()){node* n = Q.front();Q.pop();if (n){level.push_back(n->value);if (n->left)Q.push(n->left);if (n->right)Q.push(n->right);}else{stk.push(level);level.clear();if (!Q.empty())Q.push(NULL);}}while (!stk.empty()){vector<int> vec = stk.top();stk.pop();for (int i = 0; i<vec.size(); i++){cout << vec[i] << " ";}cout << endl;}}void nodeLink(node* nodes, int parent, int lchild, int rchild){nodes[parent].value = parent;if (lchild != -1){nodes[parent].left = &nodes[lchild];}if (rchild != -1){nodes[parent].right = &nodes[rchild];}}int main(){node nodes[9];nodeLink(nodes, 1, 2, 3);nodeLink(nodes, 2, 4, 5);nodeLink(nodes, 3, -1, 6);nodeLink(nodes, 4, -1, -1);nodeLink(nodes, 5, 7, 8);nodeLink(nodes, 6, -1, -1);nodeLink(nodes, 7, -1, -1);nodeLink(nodes, 8, -1, -1);printNodeByLevelDowntoUp(&nodes[1]);return 0;}
结果:
7 8
4 5 6
2 3
1
3.访问第k层节点(从左到右),根节点为0层
用上面的BFS
#include <iostream>#include<queue>#include<stack>using namespace std;struct node{int value;node* left;node* right;node() :left(NULL), right(NULL){}};void printNodeLevelK(node* root,int K){if (root == NULL)return;queue<node*> Q;Q.push(root);Q.push(NULL);int level = 0;while (!Q.empty()){node* n = Q.front();Q.pop();if (n){if (level == K)cout << n->value << " ";if (n->left)Q.push(n->left);if (n->right)Q.push(n->right);}else{level++;if (!Q.empty()){//否则死循环Q.push(NULL);}}}cout << endl;}void nodeLink(node* nodes, int parent, int lchild, int rchild){nodes[parent].value = parent;if (lchild != -1){nodes[parent].left = &nodes[lchild];}if (rchild != -1){nodes[parent].right = &nodes[rchild];}}int main(){node nodes[9];nodeLink(nodes, 1, 2, 3);nodeLink(nodes, 2, 4, 5);nodeLink(nodes, 3, -1, 6);nodeLink(nodes, 4, -1, -1);nodeLink(nodes, 5, 7, 8);nodeLink(nodes, 6, -1, -1);nodeLink(nodes, 7, -1, -1);nodeLink(nodes, 8, -1, -1);printNodeLevelK(&nodes[1],2);return 0;}
结果:
4 5 6
也可以用递归,见编程之美P2534.百度面试题:输出二叉树第 m 层的第 k 个节点值(m, k 均从 0 开始计数)
#include <iostream>#include<queue>#include<stack>using namespace std;struct node{int value;node* left;node* right;node() :left(NULL), right(NULL){}};void printNodeLevelMK(node* root,int m,int k){if (root == NULL)return;queue<node*> Q;Q.push(root);Q.push(NULL);int level = 0;int kk = 0;while (!Q.empty()){node* n = Q.front();Q.pop();if (n){if (level == m){kk++;if (kk - 1 == k)cout << n->value << endl;}if (n->left)Q.push(n->left);if (n->right)Q.push(n->right);}else{level++;if (!Q.empty()){//否则死循环Q.push(NULL);}}}}void nodeLink(node* nodes, int parent, int lchild, int rchild){nodes[parent].value = parent;if (lchild != -1){nodes[parent].left = &nodes[lchild];}if (rchild != -1){nodes[parent].right = &nodes[rchild];}}int main(){node nodes[9];nodeLink(nodes, 1, 2, 3);nodeLink(nodes, 2, 4, 5);nodeLink(nodes, 3, -1, 6);nodeLink(nodes, 4, -1, -1);nodeLink(nodes, 5, 7, 8);nodeLink(nodes, 6, -1, -1);nodeLink(nodes, 7, -1, -1);nodeLink(nodes, 8, -1, -1);printNodeLevelMK(&nodes[1],2,1);return 0;}
结果5
0 0
- 编程之美:层次遍历二叉树若干问题
- [编程之美]二叉树的层次遍历
- 二叉树层次遍历——编程之美
- 编程之美:分层遍历二叉树
- 编程之美---分层遍历二叉树
- 分层遍历二叉树-编程之美
- 编程之美-----分层遍历二叉树
- [编程之美]分层遍历二叉树
- [编程之美] 分层遍历二叉树
- 编程之美--分层遍历二叉树
- 编程之美-分层遍历二叉树
- 编程之美 - 分层遍历二叉树
- 二叉树之层次遍历
- 二叉树之层次遍历
- 读书笔记之编程之美 - 3.10 分层遍历二叉树
- 编程之美系列之二叉树的分层遍历
- 编程之美读书笔记_3.10 分层遍历二叉树
- 编程之美读书笔记_3.10 分层遍历二叉树
- 初学swift
- VMware Workstation 11 中 Ubuntu 14.04 的 VMware Tools 问题 : 共享文件夹
- 11..反射
- android httpClient 支持HTTPS的2种处理方式
- mysql悲观锁以及乐观锁总结和实践
- 编程之美:层次遍历二叉树若干问题
- 12..线程
- 第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC
- 图算法—Problem B
- 【leetcode】119. Pascal's Triangle II
- ZigBee快速入门
- 自定义动画效果(左右晃动)
- 13..Swing
- 怎么解决NiceLabel中出现错误消息1190