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