1、任意一个节点的子节点的个数都不受限制的树 2 二叉树:任意一个节点的子节点个数最多两个,且子节点的位置不能 更改。 二叉树的分类:一般二叉树, 满二叉树:在不增加树的层次的前提下,无法再多添加一个节点的二叉树就是满二叉树。 完全二叉树:如果只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树。 3 森林:n个互不相交的树的集合。 树的存储: 二叉树的存储: 连续存储(完全二叉树) 优点:查找某个节点的父节点和子节点(也包括判断有没有节点)很方便 缺点:耗用的内存很大。 链式存储: 一般树的存储: 1 双亲存储表示法:求父节点方便 2 孩子链式表示法:求子节点方便 3
2、双亲孩子表示法:求父节点和子节点都很方便 4 孩子兄弟链式表示法:把一个普通树转化成二叉树来存储 具体的转换方法:设法保证任意一个节点的左指针域指向他的第一个孩子,右指针域指向他的堂兄弟,只要能满足此条件,就可以把一个普通树转化为一个二叉树。一个普通树转化成德二叉树一定没有右子树。 森林的存储:先把森林转化为二叉树,再存储二叉树 树的操作:1遍历 先序遍历(根左右) 中序遍历(左根右) 后序遍历(左右根) 2已知两种遍历序列求原始二叉树:1 已知先序遍历和中序遍历:根据先序遍历确定根节点,再根据先序遍历确定根节点左子树和右子树的根(最先出现的即为所选),根据中序遍历和先序遍历一次确定该二叉树。
3、 2 已知中序遍历和后序遍历:根据后序遍历确定根节点,再根据中序遍历确定左子树和右子树有哪些,在判断左右子树的根节点(左右子树的序列中根据中序遍历,最后出现的即为根节点。)(注:已知先序遍历和后序遍历是无法还原出原始的二叉树的) 也就是说只有通过先序和中序 或者 通过中序和后序 我们才能唯一的确定一个二叉树。树的应用:树是数据库中数据组织的一种重要形式 操作系统子父进程的关系本身就是一棵树 面向对象语言中类的继承关系本身就是一颗二叉树 哈弗曼树(最优二叉树)1 二叉树的各种方法的实现 /*2012年3月19日16:51:01 作者:陈金林目的:实现二叉树的各种算法*/#include stdl
4、ib.h#define MaxSize 50typedef char ElemType;typedef struct node ElemType data; /数据元素 struct node *lchild; /指向左孩子 struct node *rchild; /指向右孩子 BTNode;extern void CreateBTNode(BTNode *&b,char *str);extern BTNode *FindNode(BTNode *b,ElemType x);extern BTNode *LchildNode(BTNode *p);extern BTNode *RchildN
5、ode(BTNode *p);extern int BTNodeDepth(BTNode *b);extern void DispBTNode(BTNode *b);extern int BTWidth(BTNode *b);extern int Nodes(BTNode *b);extern int LeafNodes(BTNode *b);int main(void) BTNode *b,*p,*lp,*rp; CreateBTNode(b,A(B(D,E(H(J,K(L,M(,N),C(F,G(,I); printf(nn=二叉树的各个方法的实现=n (1)输出二叉树: DispBTNo
6、de(b); (2)H结点: p=FindNode(b, if (p!=NULL) lp=LchildNode(p); if (lp!=NULL) printf( 左孩子为%c ,lp-data); else 无左孩子 rp=RchildNode(p); if (rp! 右孩子为%c,rp- 无右孩子 (3)二叉树b的深度:%dn,BTNodeDepth(b); (4)二叉树b的宽度:,BTWidth(b); (5)二叉树b的结点个数:,Nodes(b); (6)二叉树b的叶子结点个数:,LeafNodes(b); return 0;void CreateBTNode(BTNode *&b,c
7、har *str) /由str串创建二叉链 BTNode *StMaxSize,*p=NULL; int top=-1,k,j=0; char ch; b=NULL; /建立的二叉树初始时为空 ch=strj; while (ch!=0) /str未扫描完时循环 switch(ch) case (:top+;Sttop=p;k=1; break; /为左结点)top-;break;,k=2; /为右结点 default:p=(BTNode *)malloc(sizeof(BTNode); p-data=ch;p-lchild=p-rchild=NULL; if (b=NULL) /p指向二叉树
8、的根结点 b=p; else /已建立二叉树根结点 switch(k) case 1:Sttop-lchild=p; case 2:rchild=p; j+; ch=strj;BTNode *FindNode(BTNode *b,ElemType x) /返回data域为x的结点指针 BTNode *p; if (b=NULL) return NULL; else if (b-data=x) return b; else p=FindNode(b-lchild,x); if (p! return p; else return FindNode(b-rchild,x);BTNode *Lchil
9、dNode(BTNode *p) /返回*p结点的左孩子结点指针 return p-lchild;BTNode *RchildNode(BTNode *p) /返回*p结点的右孩子结点指针rchild;int BTNodeDepth(BTNode *b) /求二叉树b的深度 int lchilddep,rchilddep; if (b=NULL) return(0); /空树的高度为0 lchilddep=BTNodeDepth(b-lchild); /求左子树的高度为lchilddep rchilddep=BTNodeDepth(b-rchild); /求右子树的高度为rchilddep r
10、eturn (lchilddeprchilddep)? (lchilddep+1):(rchilddep+1);void DispBTNode(BTNode *b) /以括号表示法输出二叉树(此处用的是先序遍历) if (b! printf(%c,b- if (b-lchild!=NULL | b-rchild!( DispBTNode(b- if (b-=NULL) printf(,)/*void DispBTNode1(BTNode *b) /以括号表示法输出二叉树(此处用的是中序遍历)void DispBTNode2(BTNode *b) /以括号表示法输出二叉树(此处用的是后序遍历)int BTWidth(BTNode *b) /求二叉树b的宽度 struct int lno; /结点的层次编号 BTNode *p; /结点指针 QuMaxSize; /定义顺序非循环队列 int front,rear; /定义队首和队尾指针 int l
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1