0
点赞
收藏
分享

微信扫一扫

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


1.层次遍历

不多说,很简单


2.按深度从下到到上分层遍历二叉树

用栈保存每层即可

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

#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 条评论