第6章 树(Tree)
树(Tree)是n (n>=0)个结点的有限集。 n=0时称为空树。在任意一棵非空树中:
1)有且仅有一个特定的称为根(Root)的结点;
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
二叉树(Binary Tree)是n (n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点
的左子树和右子树的二叉树组成。
/* 二叉树的二叉链表结点结构定义 */ typedef struct BiTNode /* 结点结构 */ { TElemType data; /* 结点数据 */ struct BiTNode *lchild, *rchild; /* 左右孩子指针 */ } BiTNode, *BiTree;
二叉树遍历方法包括:
1、前序遍历
/* 二叉树的前序遍历递归算法 */ void PreOrderTraverse(BiTree T) { if ( T==NULL ) return; printf("%c",T->data); /* 显示结点数据,可以更改为其他对结点操作 */ PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */ PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */ }
2、中序遍历
/* 二叉树的中序遍历递归算法 */ void InOrderTraverse(BiTree T) { if ( T==NULL ) return; InOrderTraverse(T->lchild); /* 中序遍历左子树 */ printf("%c",T->data); /* 显示结点数据,可以更改为其他对结点操作 */ InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */ }
3、后序遍历
/* 二叉树的后序遍历递归算法 */ void PostOrderTraverse(BiTree T) { if ( T==NULL ) return; PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */ PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */ printf("%c",T->data); /* 显示结点数据,可以更改为其他对结点操作 */ }
4、层序遍历
层序遍历书中没有附上算法,整理结果如下。
层序遍历算法中采用了队列(FIFO)方式实现,关于队列的实现这里不细说。
/* 二叉树的层序遍历递归算法 */ void LayerOrderTraverse(BiTree T) { if ( T==NULL ) return; BiTree *x; Queue Q; /* 定义队列Q */ InitQueue(&Q); /* 初始化队列Q */ EnQueue(&Q,T); /* 将根结点入列 */ while(! QueueEmpty(Q)) /* 若队列非空 */ { DeQueue(&Q, x); /* 将队列中元素出列,并赋值给x */ printf("%c",(*x)->data); /* 显示结点数据,可以更改为其他对结点操作 */ if ((*x)->lchild) EnQueue(&Q,(*x)->lchild); /* 左子树非空,则将左子树入列 */ if ((*x)->rchild) EnQueue(&Q,(*x)->rchild); /* 右子树非空,则将右子树入列 */ } }