自己随便写的加深记忆,方便敢看
用到了
队列:按层遍历
栈:非递归中序遍历
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *ltree;//*和后面自定义的name不要分开 哪个是在一起的
struct Node *rtree;
}Tree;
Tree * creatTree(int a[],int n)
{//动态建立
Tree *root,*t,*p,*c;
root=t=p=c=NULL;
for(int i=0;i<n;i++)
{
p=(Tree *)malloc(sizeof(Tree));
p->data=a[i];
p->ltree=p->rtree=NULL;
if(root==NULL)
{
root=p;
}
else{
c=root;
//这块是找到你需要插入的位置是在哪里
while(c)
{
t=c;
if(p->data<c->data) c=c->ltree;
else{
c=c->rtree;
}
}
//这块是分配在左子树还是右子树
if(p->data<t->data) t->ltree=p;
else{
t->rtree=p;
}
}
}
return root;
}
//队列按层输出
void levelorder(Tree *root)
{
Tree **Q,*q;
Q=(Tree**)malloc(100*sizeof(Tree*));
int f,r;
f=r=0;
//root入队列
Q[++r]=root;
while(f-r)
{
q=Q[++f];
printf("%d\n",q->data);
if(q->ltree) Q[++r]=q->ltree;
if(q->rtree) Q[++r]=q->rtree;
}
free(Q);
}
//先序遍历
void first(Tree *root)
{
if(root)
{
printf("%d\n",root->data);
first(root->ltree);
first(root->rtree);
}
}
//非递归中序遍历
void inorder(Tree *root)
{
Tree **Q,*p;
//用栈
int top=-1;
Q=(Tree**)malloc(100*sizeof(Tree*));
//将所有的左子树先进栈
for(p=root;p;p=p->ltree) Q[++top]=p;
while(top!=-1)
{
p=Q[top--];
printf("%d\n",p->data);
if(p->rtree)//如果有右子节点,把右子节点加入栈
{
for(p=p->rtree;p;p=p->ltree)
{
Q[++top]=p;
}
}
}
free(Q);
}
int main()
{
Tree* root;
root=NULL;
int a[]={3,1,2,4,5,6,7};
root=creatTree(a,sizeof(a)/4);
// printf("%d",sizeof(a)/4);
levelorder(root);
printf("===========================");
// first(root);
inorder(root);
}