#include<iostream>
#include<queue>
using namespace std;
struct node{
int data;
node *lchild,*rchild;
int layer; //存放树的层次
};
node* newnode(int x){ //生成一个新结点
node* r=new node;
r->data=x;
r->lchild=r->rchild=NULL;
return r;
}
void insert(node* &root,int x){
//插入一个结点 ,修改指针地址,需要引用
if(root==NULL){
root=newnode(x);
return;
}
if(x<root->data){ //这里的规则可以修改
insert(root->lchild,x);
}
else{
insert(root->rchild,x);
}
}
void search(node* root,int x,int newdata) {
//查找一个值为x的结点并修改其值为newdata ,修改指针指向的值,不需引用
if(root->data==x)
{
root->data=newdata;
return;
}
search(root->lchild,x,newdata);
search(root->rchild,x,newdata);
}
node * creating(int a[],int n){ //创建二叉树
node* root=NULL;
for(int i=0;i<n;i++)
insert(root,a[i]);
return root;
}
//四个遍历
void preorder(node* root){ //先序遍历
if(root==NULL)return;
printf("%d",root->data);
preorder(root->lchild);
preorder(root->rchild);
}
void inorder (node* root){ //中序遍历
if(root==NULL)return;
inorder(root->lchild);
printf("%d",root->data);
ineorder(root->rchild);
}
void postorder (node* root){ //后序遍历
if(root==NULL)return;
postorder(root->lchild);
postorder(root->rchild);
printf("%d",root->data);
}
void layerorder(node* root) { //层次遍历并标记层次
if(root==NULL)return;
queue <node*> q;
//队列保存原元素的一个副本,这里存指针才能修改layer
root->layer=0;
node* temp=root;
q.push(temp);
while(!q.empty()) {
temp=q.front();q.pop();
printf("%d",temp->data);
if(temp->lchild!=NULL){
temp->lchild->layer=temp->layer+1;//层次标记
q.push(temp->lchild);
}
if(temp->rchild!=NULL){
temp->rchild->layer=temp->layer+1;
q.push(temp->rchild);
}
}
}
int main()
{
int a[]={1, 2, 3,4,5,6} ;
node* s=creating(a,6) ;
layerorder(s);
return 0;
}
实际上二叉树的实现和链表的实现大同小异,对比结构,只是其是左右两个指针,所以又称为二叉链表,而链表有静态实现,故二叉树有有静态实现,了解即可。