题目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){}
};
void PrintNodeByLevel(Node * root)
{
vector<Node *> vec;
int cur = 0;
int last = 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){}
};
void PrintNodeByLevel(Node * root)
{
vector<Node *> vec;
int cur = 0;
int last = 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;
else
cout << (*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");
}
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){}
};
void PrintNodeByLevel(Node * root)
{
vector<Node *> vec;
int cur = 0;
int last = 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;
else
cout << (*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){}
};
void PrintNodeByLevel(Node * root)
{
vector<Node *> vec;
vector<vector<int> > result;
vector<int> val;
int cur = 0;
int last = 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");
}