文档详情

树和二叉树2(二叉树基本应用)解析.ppt

发布:2016-10-17约9.57千字共52页下载文档
文本预览下载声明
例:已知前序遍历序列为ABC,后序遍历序列为CBA,则下列二叉树都满足条件。 A B C A B C 若已知一棵二叉树的前序序列和后序序列,能否唯一确定这棵二叉树呢? 若已知一棵二叉树的前序序列和中序序列,能否唯一确定这棵二叉树呢?怎样确定? 例如:已知一棵二叉树的前序遍历序列和中序遍历序列分别为ABCDEFGHI 和BCAEDGHFI,如何构造该二叉树呢? 前序:A B C D E F G H I中序:B C A E D G H F I 前序:B C 中序:B C B C D E F G H I A 前序: D E F G H I 中序: E D G H F I A B C D E FG HI 前序:F G H I 中序:G H F I 前序: D E F G H I 中序: E D G H F I A B C D E FG HI A B C D E F I G H 2 统计二叉树中叶子结点的个数 先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。 由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点” 的操作改为:若是叶子,则计数器增1。 算法基本思想: void CountLeaf (BiTree T, int* count){ if ( T ) { if ((!T-lchild) (!T-rchild)) *count++; // 对叶子结点计数 CountLeaf( T-lchild, count); CountLeaf( T-rchild, count); } // if } // CountLeaf int CountLeaf (BiTree T){ //返回指针T所指二叉树中所有叶子结点个数 if (!T ) return 0; if (!T-lchild !T-rchild) return 1; else{ m = CountLeaf( T-lchild); n = CountLeaf( T-rchild); return (m+n); } //else } // CountLeaf 3、求二叉树的深度(后序遍历) 算法基本思想: 从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。 首先分析二叉树的深度和它的左、右子树深度之间的关系。 算法: int BiTreeDepth(BiTree T) { if(T == NULL) return 0; else{ int dep1=BiTreeDepth(T-lchild); int dep2 = BiTreeDepth(T-rchild); return max(dep1,dep2)+1; } } void Depth(BiTree T , int level, int dval){ if ( T ) { if (leveldval) dval = level; Depth( T-lchild, level+1, dval ); Depth( T-rchild, level+1, dval ); } } // 调用之前 level 的初值为 1。 // dval 的初值为 0. 在二叉树不空的前提下,和根结点的元素进行比较,若相等,则找到返回 TRUE; 否则在左子树中进行查找,若找到,则返回 TRUE; 否则继续在右子树中进行查找,若找到,则返回 TRUE,否则返回 FALSE; 4、查询二叉树中某个结点 算法思想: Status Preorder (BiTree T, ElemType x) { // 若二叉树中存在和 x 相同的元素,则 p 指向该结点并返回 OK, // 否则返回 FALSE } if (T) { if (T-data==x) return OK; }//if else return FALSE; else { if (Preorder(T-lchild, x) return OK; else return(Preorder(T-rchild, x)) ; }//else 5 二叉链表的生成 按如
显示全部
相似文档