编程之美:层次遍历二叉树若干问题

来源:互联网 发布:手机网络投资理财收益 编辑:程序博客网 时间: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

也可以用递归,见编程之美P253


4.百度面试题:输出二叉树第 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
原创粉丝点击