链式存储
#include<iostream>
#include<queue>
using namespace std;
struct node{
int data;
node *left , *right;
node(int data = 0):data(data) , left(NULL) , right(NULL){}
};
void creat_tree_bfs(vector<int> seq , node* &root)
{
queue<node*> q;
for(int i = 0 ; i < seq.size() ; ){
if(i == 0){
root = new node();
root->data = seq[i];
q.push(root);
i++;
}
else
{
if(seq.size() - i >= 2){
node* tmp_left = new node(seq[i++]);
node* tmp_right = new node(seq[i++]);
q.push(tmp_left);q.push(tmp_right);
node* tmp = q.front();
q.pop();
tmp->left = tmp_left;
tmp->right = tmp_right;
}
else if(seq.size() - i == 1){
node* tmp_left = new node(seq[i++]);
q.push(tmp_left);
node *tmp = q.front();
q.pop();
tmp->left = tmp_left;
}
}
}
}
void pre_order(node *root)
{
if(root == NULL) return;
cout<<root->data<<" ";
pre_order(root->left);
pre_order(root->right);
}
void in_order(node *root)
{
if(root == NULL) return;
in_order(root->left);
cout<<root->data<<" ";
in_order(root->right);
}
void post_order(node *root)
{
if(root == NULL) return;
post_order(root->left);
post_order(root->right);
cout<<root->data<<" ";
}
void dfs_order(node* root)
{
queue<node*> q;
q.push(root);
while(!q.empty()){
node* tmp = q.front();
q.pop();
cout<<tmp->data<<" ";
if(tmp->left != NULL){
q.push(tmp->left);
}
if(tmp->right != NULL){
q.push(tmp->right);
}
}
}
int main()
{
node* root = NULL;
int n;
cin>>n;
vector<int> vec;
for(int i = 0 ; i < n ; i ++){
int v;
cin>>v;
vec.push_back(v);
}
creat_tree_bfs(vec,root);
pre_order(root);
in_order(root);
post_order(root);
dfs_order(root);
return 0;
}
顺序存储
#include<iostream>
#include<queue>
using namespace std;
const int maxn = 10010;
struct Tree{
int data[maxn];
int len;
}BinTree;
void CreateTree()
{
cin >> BinTree.len;
for(int i = 1 ; i <= BinTree.len ; i ++){
cin >> BinTree.data[i];
}
}
void dfs(int root)
{
if(root > BinTree.len || BinTree.data[root] == -1) return;
cout<<BinTree.data[root]<<" ";
dfs(root * 2);
dfs(root * 2 + 1);
}
void InOrder(int root)
{
if(root > BinTree.len || BinTree.data[root] == -1) return;
InOrder(root * 2);
cout<<BinTree.data[root]<<" ";
InOrder(root * 2 + 1);
}
void PostOrder(int root)
{
if(root > BinTree.len || BinTree.data[root] == -1) return;
PostOrder(root * 2);
PostOrder(root * 2 + 1);
cout<<BinTree.data[root]<<" ";
}
void dfsOrder(int root)
{
queue<int> q;
q.push(root);
while(!q.empty()){
int tmp = q.front();
q.pop();
cout<<BinTree.data[tmp]<<" ";
if(BinTree.data[tmp * 2] != -1 && tmp * 2 <= BinTree.len){
q.push(tmp * 2);
}
if(BinTree.data[tmp * 2 + 1] != -1 && tmp * 2 + 1 <= BinTree.len){
q.push(tmp * 2 + 1);
}
}
}
int main()
{
CreateTree();
printf("先序遍历: ");
dfs(1);
printf("\n中序遍历: ");
InOrder(1);
printf("\n后序遍历: ");
PostOrder(1);
printf("\n层序遍历: ");
dfsOrder(1);
return 0;
}