1.二叉树的遍历(traversing binary tree):
从根结点出发,按照某种次序依次访问各个结点,且每个结点有且仅被访问一次。
1)前序遍历:先访问各个根结点,顺序遍历左子树,再顺序遍历右子树。输出第一个为根节点。
2)中序遍历:从根节点开始,先遍历左子树,然后是遍历右子树,最后是节点;
3)后序遍历:先从左到右遍历叶子,然后到分支节点,最后是根节点。
2二叉树的建立
叶子的指针域是指向NULL的,但在建立二叉树时,需要判断该节点是否有左右孩子节点,因此将叶子结点的lchild和rchild指针指向一个虚拟的节点,并赋予特定的值来表示结束,以便于插入新的结点。
#include<stdio.h>
#include<stdlib.h>
#define endmark 1000//定义叶子的结束标志
typedef int Elemtype ;
typedef struct treenode//创建树节点的结构体
{
Elemtype data;
struct treenode * lchild;
struct treenode * rchild;
}treenode,*tree;
void creattree(tree (*treeptr))//前序遍历
{
Elemtype temp;//缓存输入
tree ptr;
scanf("%d",&temp);
if (temp==endmark)
{
*treeptr = NULL;
return;
}
else
{
ptr = (tree)malloc(sizeof(treenode));
ptr->data=temp;
*treeptr = ptr;
creattree(&(*treeptr)->lchild);//对左子树赋值
creattree(&(*treeptr)->rchild);//对右子树赋值
}
}
void PreOrderTraverse(tree treeptr)//前序遍历
{
if (treeptr==NULL)
{
return;
}
else
{
printf("%d\n",treeptr->data);
PreOrderTraverse(treeptr->lchild);//对左子树赋值
PreOrderTraverse(treeptr->rchild);//对右子树赋值
}
}
void InOrderTraverse(tree treeptr)//中序遍历
{
if (treeptr==NULL)
{
return;
}
else
{
InOrderTraverse(treeptr->lchild);//对左子树赋值
printf("%d\n",treeptr->data);
InOrderTraverse(treeptr->rchild);//对右子树赋值
}
}
void PostOrderTraverse(tree treeptr)//后序遍历
{
if (treeptr==NULL)
{
return;
}
else
{
PostOrderTraverse(treeptr->lchild);//对左子树赋值
PostOrderTraverse(treeptr->rchild);//对右子树赋值
printf("%d\n",treeptr->data);
}
}
void main()
{
tree treehead=NULL;
creattree(&treehead);//创建二叉树
printf("\n前序输出\n");
PreOrderTraverse((treehead));
printf("\n中序序输出\n");
InOrderTraverse(treehead);
printf("\n后序输出\n");
PostOrderTraverse(treehead);
system("pause");
}
其中1000为结束标志 输入1、2、3、1000、1000、4、1000、1000、5、6、1000、1000、7、1000、1000
顺序输出为:1、2、3、4、5、6、7
中序输出为:3、2、4、1、6、5、7
后序输出为:3、4、2、6、7、5、1