创建二叉树,终端结点以-1结束:
typedef struct
{
int data;
int lchild;
int rchild;
}tree_t;
/*
建立一个二叉树
*/
void create_tree(tree_t** bt)
{
int data;
scanf("%d", &data);
if(data == -1)
*bt = NULL ;
else
{
*bt = (tree_t *)malloc(sizeof(tree_t));
(*bt)->data = data;
create_tree(&(*bt)->lchild);
create_tree(&(*bt)->rchild);
}
}
先序遍历:
1、访问根结点
2、先序遍历根结点的左子树
3、先序遍历根结点的右子树
递归的方法遍历:
/*
先序遍历 递归
*/
void PreOrder(tree_t* head)
{
if(head == NULL)
return ;
printf("%d ",head->data);
PreOrder(head->lchild) ;
PreOrder(head->rchild) ;
}
/*
先序遍历 栈
*/
void PreOrder_st(tree_t* head)
{
int top = -1;
tree_t st[MAXSIZE] ; //构成栈
tree_t* p = head;
if(p == NULL)
return ;
while( !((top==-1) && (p==NULL)) )
{
while(p != NULL)
{
printf("%d ",p->data); //输出节点数据
if(top < MAXSIZE - 1)
{
top++;
st[top] = *p ; //压栈
}
else
{
printf("stack full\n");
return ;
}
p = p->lchild ;
}
if(top == -1)
{
return ;
}
else
{
p = &st[top] ;
p = p->rchild;
top--;
}
}
}
中序遍历:
1、中序遍历根结点的左子树
2、访问根结点
3、中序遍历根结点的右子树
递归的方法遍历:
/*
中序遍历 递归
*/
void InOrder(tree_t* head)
{
if(head == NULL)
return ;
InOrder(head->lchild);
printf("%d ",head->data);
InOrder(head->rchild);
}
栈的方法遍历:
/*
中序遍历 栈
*/
void InOrder_st(tree_t *head)
{
int top = -1;
tree_t st[MAXSIZE];
tree_t *p = head;
if(p == NULL)
return ;
while( !((top==-1) && (p == NULL)))
{
while(p != NULL)
{
if(top < MAXSIZE - 1)
{
top++;
st[top] = *p;
}
else
return ;
p = p->lchild;
}
if(top == -1)
return ;
else
{
p = &st[top];
printf("%d ",p->data);//这里和先序遍历的区别
p = p->rchild;
top--;
}
}
}
后序遍历:
1、后序遍历根结点的左子树
2、后序遍历根结点的右子树
3、访问根结点
递归的方法遍历:
/*
后序遍历 递归
*/
void PostOrder(tree_t* head)
{
if(head == NULL)
return ;
PostOrder(head->lchild);
PostOrder(head->rchild);
printf("%d ",head->data);
}
层序遍历:
1、从二叉树的根结点开始,从上到下逐层遍历,在同一层中从左至右对结点逐个访问。
用队列的方法遍历:
/*
层序遍历 队列
*/
void LevelOrder(tree_t* head)
{
tree_t tab[MAXSIZE];
int rear = 0 ;
int front = -1;
if(head == NULL)
return ;
tab[rear] = *head ;
while(front != rear)
{
front++ ;
printf("%d ",tab[front].data);
if(tab[front].lchild != NULL)
{
rear++;
tab[rear] = *tab[front].lchild ;
}
if(tab[front].rchild != NULL)
{
rear++;
tab[rear] = *tab[front].rchild ;
}
}
}