- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.二叉树的生成算法 生成二叉树的二叉链表的方法有多种,而且算法都比较复杂,其 原理是依次插入结点,构造二叉树的二叉链表。 根据二叉树的二叉链表存储结构,使用一种有辅助数组的创建二 叉树的二叉链表的算法。该算法是利用了二叉树的性质5,对于一般 二叉树,必须添加若干个虚结点使其成为完全二叉树,然后按编号 输入结点信息,构建二叉链表。 例 根据二叉链表结构,使用辅助数组,创建一棵如图1所示二叉树的二叉链表。 算法思想:先按完全二叉树对其进行编号,编号后的情况如图2中第一行所示。该算法中使用一个辅助向量s用于存放二叉树结点的指针(地址),如s[i]中应该存放编号为i的结点的地址指针。此例原始数据序列如图(2)所示,第一行是结点的编号,第二行是结点的数据。按编号、结点值顺序依次输入即可生成二叉链表。 A B C D E F 图1 1 data s[i]存放地址 1 3 2 4 5 7 A B C D E F 图2 当结点编号为1时,所产生的结点是根节点,同时将指向 该结点的指针存入s[1] 当结点编号i1时,产生一个新的结点之后,也要将指向 该结点的指针存入s[i]。由性质5可知:它的双亲结点编号 是j=[i/2]。 当i为偶数,则它是双亲结点的左孩子,即让s[j]-lch= s[i]; 当i为奇数,则它是双亲结点的右孩子,即让s[j]-rch= s[i]。 就是这样将新输入的结点逐一与其双亲结点相连,生成二叉链 表。 二叉链表的结点结构: struct tnode { int data; struct tnode *lchild, *rchild; } typedef struct tnode TNODE; 辅助数组s是一个指针数组,每个数组元素是指向TNODE类 型的指针,即TNODE *s[20]。 二叉链表的生成算法如下: TNODE *creat( ) /*按性质5进行建树*/ { TNODE *p; int i, j; int x; TNODE *s[20]; TNODE *t=NULL; printf(“ \n i, x=“); /*提示输入第1个元素与值 */ scanf(“%d%c”, i, x); /*键盘输入第1个元素与值 */ While((i!=0)(x!=0)) /*结点序号不为0、结点值不为0时循环 输入 */ { p=(TNODE *)malloc(sizeof(TNODE)); /*产生一个新结点 */ p- data=x; /*赋结点值*/ p -lchild=NULL; /*赋左孩子值*/ p -rchild=NULL; /*赋右孩子值*/ s[i]=p; /*用数组第i个单元存放指向此结点的指针*/ if(i==1) t=p; /*若是第1个,将t指向它为根*/ else { /*否则,为子树,计算子树的位置j*/ j=i/2; /* 取j为i/2 */ if((i%2)==0 ) s[j] -lchild=p; /* j为偶数,是左子树*/ else s[j] -rchild=p; /* j为奇数,是右子树*/ } printf(“\n i,x=“); /* 提示输入下一个元素序号与值*/ scanf(“%d%c”,i,x); /*键盘输入下一个元素序号与值*/ } return t; } 这个算法中,循环的结束条件是输入的两个数据都为零,即i,x都为 零时不再分配新结点,跳出循环体。如果输入的第一组数据就是两 个0,该函数不执行循环体将返回空指针值NULL,在源程序的主函 数中应该按如下方法调用这个建立二叉链表的函数: TNODE *root; root=creat(); 经过这样的调用,主函数的指针变量root就指向一棵建立好的二叉树 的二叉链表,具体来讲指向根节点。 3.3 二叉树的遍历 遍历二叉树是二叉
文档评论(0)