二叉链表的类型定义——教材101页
typedef struct btnode
{
DataType data;
struct btnode *lchild,*rchild;//指向左右孩子的指针
} *BinTree;
三叉链表的类型定义——教材102页
typedef struct ttnode
{
DataType data;
struct ttnode *lchild,*parent,*rchild;//在二叉链表的基础上多了一个 指向双亲的指针
} *TBinTree;
TBinTree root;
二叉链表的三种遍历的递归算法
1 先序遍历-根,左,右
void preorder(BinTree bt)
{
if (bt != NULL)
{
visit (bt);//根
preorder (bt->lchild);//左
preorder (bt->rchild);//右
}
}
2 中序遍历-左,根,右
void preorder(BinTree bt)
{
if (bt != NULL)
{
inorder (bt->lchild);//左
visit (bt);
inorder (bt->rchild);//右
}
}
3 后序遍历-左,右,根
void postorder(BinTree bt)
{
if (bt != NULL)
{
postorder (bt->lchild);//左
postorder (bt->rchild);//右
visit (bt);//根
}
}
利用二叉树遍历的递归算法,求二叉树的高度——教材106页
int Height(BinTree bt)
{
int lh,rt;
if (bt == NULL)
return 0;
else
{
lh=Height(bt->lchild);
rh=Height(bt->rchild);
return 1+(lh>rh ? lh : rh);
}
}
二叉树的层次遍历
void lebelorder(BinTree bt)
{
LkQue Q;
InitQueue(&Q);//初始化队列
if (bt != NULL)
{
EnQueue(&Q,bt);//根结点入队列
while (!EmptyQueue(Q))
{
p=Gethead(&Q);
outQueue(&Q);//结点出队列
visit(p);//被访问结点
if (p->lchild != NULL) EnQueue(&Q,p->lchid);//左孩子结点入队列
if (p->rchild != NULL) EnQueue(&Q,p->rchid);//右孩子结点入队列
}
}
}
二叉树遍历的非递归实现
void PreOrder(BinTree t)
//非递归先序遍历二叉树
{
BinTree p;
LkStk *LS;//LS为指向链栈的指针
if (t==NULL) return;
InitStack(LS);
p=t;
while (p !=NULL || !EmptyStack(LS)) //循环条件是当指针或栈至少有一个不为空
{
if (p != NULL)
{
Visit(p->data); //访问结点的数据
Push(LS,p); //将当前指针压入栈中
p=p->lchild; //将指针指向p的左孩子
}
else {
p=Gettop(LS); //取栈顶元素
Pop(LS); //出栈
p=p->rchild; //指针指向它的右孩子
}
}
}
应用举例
由先序序列和中序序列构造二叉树的算法
BinTree Create(char a[],char b[],int i,int j,int m,int n)
//数组a存储先序序列,i和j分别是数组a的下标的上、下界
//数组b存储中序序列,m和n分别是数组b的下标的上、下界
//函数返回由a[i]至a[j]的先序序列和b[m]至b[j]的中序序列的构成的构成的二叉树的根
{
int k;
BinTree p;
if (n<0) then return NULL;
P=malloc(sizeof(BinTree));
p->data=a[i];
k=m;
while ((k<=n) && (b[k] != a[i])) k++; //在中序列中找根
if (k>n) error(); //未找到根
p->lchild=Create(a,b,i+1,i+k-m,m,k-1); //递归构造左子树
p->rchild=Create(a,b,i+k-m+1,j,k+1,n); //递归构造右子树
return p;//返回根结点指针
}
树的储存结构
1 孩子链表——教材112页
const int MAXND=20;//树中结点的最大个数
typedef struct bnode//表结点类型
{
int child;
struct bnode *next;
} node,*childlink;
typedef struct
{
DataType data;
childlink hp;
} headnode;
headnode link[MAXND]
2 带双亲的孩子链表
const int MAXND=20;//树中结点的最大个数
typedef struct bnode//表结点类型
{
int child;
struct bnode *next;
} node,*childlink;
typedef struct
{
DataType data;
int parent;
childlink hp;
} headnode;
headnode link[MAXND]
3 孩子兄弟链表表示法
typedef struct tnode
{
DataType data;
struct tnode *son,*brother;
} *Tree;
4 双亲表示法
const int size=10;
typedef struct
{
DataType data;
int parent;
} Node;
Node slist [size];//用数组实现双亲表
posted on
浙公网安备 33010602011771号