(1)二叉树的概念
二叉树(Binary Tree)是个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。
满二叉树: 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的一棵二叉树称作满二叉树。
完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树
(2)二叉树的基本操作与存储
二叉树的二叉链表存储表示可描述为
- typedef struct BiTNode{
- elemtype data;
- struct BiTNode *lchild,rchild;
- }BiTNode,*BiTree;
建立一个二叉树,使其只有头结点
- int Initiate(BiTree *bt)
- {
- if((bt=(BiTNode *)malloc(sizeof(BiTNode))==NULL)
- return 0;
- bt->lchild=NULL;
- bt->rchild=NULL;
- return 1;
- }
(3)二叉树的遍历
二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且仅被访问一次。
先序遍历:
(1)访问根结点;
(2)先序遍历根结点的左子树;
(3)先序遍历根结点的右子树。
先序遍历二叉树的递归算法如下:
- void PreOrder(BiTree bt)
- {/*先序遍历二叉树bt*/
- if (bt==NULL) return; /*递归调用的结束条件*/
- Visite(bt->data); /*访问结点的数据域*/
- PreOrder(bt->lchild); /*先序递归遍历bt的左子树*/
- PreOrder(bt->rchild); /*先序递归遍历bt的右子树*/
- }
中序遍历:先左子树,再根,再右子树
后序遍历:先遍历树左子树,再右子树,最后根
先序遍历的非递归实现
可以利用栈的后进先出的特点实现:
- void NRPreOrder(BiTree bt)
- {/*非递归先序遍历二叉树*/
- BiTree stack[MAXNODE],p;
- int top;
- if (bt==NULL) return;
- top=0;
- p=bt;
- while(!(p==NULL&&top==0))
- { while(p!=NULL)
- { Visite(p->data); /*访问结点的数据域*/
- if (top<MAXNODE-1) /*将当前指针p压栈*/
- { stack[top]=p;
- top++;
- }
- else { printf(“栈溢出”);
- return;
- }
- p=p->lchild; /*指针指向p的左孩子*/
- }
- if (top<=0) return; /*栈空时结束*/
- else{ top--;
- p=stack[top]; /*从栈中弹出栈顶元素*/
- p=p->rchild; /*指针指向p的右孩子结点*/
- }
- }
- }