二叉树的遍历和应用PPT课件.ppt

二叉树的遍历和应用;预备知识—递归;什么是递归?;举例:查词典;递归解决方案的一般形式;举例1:n的阶乘;举例2:逆置字符串;举例3:Hanoi塔;举例4:兔子繁殖(递归法);举例4:兔子繁殖(迭代法);二叉树的遍历;一、问题的提出; 顺着某一条搜索路径巡访二叉树 中的结点,使得每个结点均被访问一 次,而且仅被访问一次。; “遍历”是任何类型均有的操作, 对线性结构而言,只有一条搜索路 径(因为每个结点均只有一个后继), 故不需要另加讨论。而二叉树是非 线性结构,;层次遍历;前序周游(preorder traversal) 若二叉树非空, 则依次进行如下操作: (1) 访问根结点; (2) 前序周游左子树; (3) 前序周游右子树。;中序周游(inorder traversal) 若二叉树非空, 则依次进行如下操作: (1) 中序周游左子树; (2) 访问根结点; (3) 中序周游右子树。;后序周游(postorder traversal) 若二叉树非空, 则依次进行如下操作: (1) 后序周游左子树; (2) 后序周游右子树; (3) 访问根结点。;已知二叉树的前序和中序周游序列如下, 画出该二叉树。 前序周游序列: ABCDEFGHIJ 中序周游序列: CBEDAGHFJI ;已知二叉树的后序和中序周游序列如下, 画出该二叉树。 后序周游序列: ABCDEFG 中序周游序列: ACBGEDF ;画出中序周游序列为ABCDEFGHIJKL的完全二叉树。;上面三种周游方法都可以用递归函数来实现 例如, 前序周游二叉树的函数为: void preorder(BinNodeElem* subroot) { if (subroot == NULL) return; visit(subroot); preorder(subroot-left()); preorder(subroot-right()); };课后思考;遍历算法的应用举例;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;Traversal Example;2、求二叉树的深度;求二叉树的深度的 伪代码设计。 ;二叉树的存储;存于顺序存储结构;以字符串的形式 根 左子树 右子树 定义一棵二叉树;Status CreateBiTree(BiTree T) { scanf(ch); if (ch== ) T = NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T-data = ch; // 生成根结点 CreateBiTree(T-lchild); // 构造左子树 CreateBiTree(T-rchild); // 构造右子树 } return OK; } // CreateBiTree;A B C D ; 仅知二叉树的先序序列“abcdefg” 不能唯一确定一棵二叉树,;a b c d e f g;void CrtBT(BiTree T, char pre[], char ino[], int ps, int is, int n ) { // 已知pre[ps..ps+n-1]为二叉树的先序序列, // ins[is..is+n-1]为二叉树的中序序列,本算 // 法由此两个序列构造二叉链表 if (n==0) T=NULL; else { k=Search(ino, pre[ps]); // 在中序序列中查询 if (k== -1) T=NULL; else { } } // }

文档评论(0)

1亿VIP精品文档

相关文档