不管是二叉树的建立 求前遍历 后遍历 还是层次遍历,都是利用中序遍历的性质 和一个前序遍历或后序遍历,将一个节点的左支所有的数,右支所有的数,和该节点的数分开,然后根据题目重新排序;
前序遍历:该节点的数、左支的数、右支的数;
中序遍历:左支的数、该节点的数、右支的数;
后序遍历:自己想想...左支的数、右支的数、该节点的数
(前序遍历就是节点的数总是在它的左支和右支的数遍历前遍历(先左支后右支); 后序遍历就是节点的数在它的左支的数和右支的数都遍历完后遍历(先左支后右支);中序就是遍历左支、遍历节点、遍历右支 这个顺序 真的不知道??。。)
其他的在揣摩揣摩 附上代码 以上问题都能解决
#include<iostream>
#include<string>
#include<cstdio>
#include<malloc.h>
using namespace std;
struct tree
{
char key;
tree *left;
tree *right;
};
tree *creat(string pre,string mid)//二叉树的建立
{
if(pre.size()<=0)
{
return NULL;
}
tree *p;
p=new tree[1];
p->key=pre[0];
int pos=mid.find(pre[0]);
p->left=creat(pre.substr(1,pos),mid.substr(0,pos));
int len=mid.size()-pos-1;
p->right=creat(pre.substr(pos+1,len),mid.substr(pos+1,len));
return p;
}
int print_mid(tree *ROOT)//中序遍历
{
if(ROOT==NULL)
{
return 0;
}
print_post(ROOT->left);
cout << ROOT->key;
print_post(ROOT->right);
return 0;
}
int print_post(tree *ROOT)//后序遍历
{
if(ROOT==NULL)
{
return 0;
}
print_post(ROOT->left);
print_post(ROOT->right);
cout << ROOT->key;
return 0;
}
int print_forth(tree *ROOT)//前序遍历
{
if(ROOT==NULL)
{
return 0;
}
cout << ROOT->key;
print_post(ROOT->left);
print_post(ROOT->right);
return 0;
}
int PrintByLevel(tree *ROOT)//层次遍历(分级遍历)
{
tree *temp[100];//存储每个节点的地址
int j;
for(j=0;j<100;j++)
{
temp[j]=NULL;
}
temp[0]=ROOT;//初始只有一个节点 即根节点
j=0;
int t=1;
while(temp[j]!=NULL)
{
if(temp[j]->left!=NULL)//不好解释 好好看看 不算复杂;
{
temp[t++]=temp[j]->left;
}
if(temp[j]->right!=NULL)
{
temp[t++]=temp[j]->right;
}
cout<<temp[j]->key;
j++;
}
}
int main()
{
string pre_order;
string post_order;
int n;cin>>n;
while(n--)
{
tree *root;
cin>>pre_order>>post_order;
root=creat(pre_order,post_order);
print_post(root);
cout<<endl;
PrintByLevel(root);
cout<<endl;
// print_forth(root);
// cout<<endl;
// print_mid(root);
// cout<<endl;
}
}