- 1、本文档共51页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章-1 树
* 非线性结构 之 树 * 前序遍历的递归算法 void preorder(BiTree *bt) { if( bt == NULL) return; visit(bt-data); preorder(bt-lchild); preorder(bt-rchild); } * 非线性结构 之 树 * 前序遍历的过程 访问-,访问+,/入栈,访问a,*入栈,*出栈,访问* 访问b,-入栈,-出栈,访问-,访问c,d入栈,d出栈 访问d,/出栈,访问/,访问e,f压栈,f出栈,访问f 访问输出序列:- + a * b – c d / e f – + / a * e f b – c d 根据前序遍历的算法,有些结点将被系统压栈、出栈。具体如下: 何时结束? * 非线性结构 之 树 * 中序遍历 算法描述: 若二叉树为空,遍历结束; 否则 按中序遍历左子树; 访问根结点; 按中序遍历右子树; – + / a * e f b – c d 对于左图的二叉树,用中序便历算法得到的输出序列为: a + b * c – d – e / f * 非线性结构 之 树 * 中序遍历的递归算法 void inorder(BiTree *bt) { if( bt == NULL) return; inorder(bt-LChild); visit(bt-data); inorder(bt-RChild); } * 非线性结构 之 树 * 后序遍历 算法描述: 若二叉树为空,遍历结束; 否则 按后序遍历左子树; 按后序遍历右子树; 访问根结点; – + / a * e f b – c d 对于左图的二叉树,用后序便历算法得到的输出序列为: a b c d - * + e f / - * 非线性结构 之 树 * 后序遍历的递归算法 void postorder(BiTree *bt) { if( bt == NULL) return; postorder(bt-LChild); postorder(bt-RChild); visit(bt-data); } * 非线性结构 之 树 * 层次遍历 从第一层(根结点)开始,从上到下逐层遍历,同一层中,从左到右逐个访问。 算法实现--设置队列 从根结点开始,结点指针入队,从队头取元素,执行: 1.访问该元素所指结点 2.若该结点左、右子结点非空,则左、右子结点指针入队。 – + / a * e f b – c d 对于左图的二叉树,用层次便历算法得到的输出序列为: - + / a * e f b - c d * 非线性结构 之 树 * 层次遍历算法 void LevelOrder(BiTree *bt) { //层次遍历二叉树bt BiTree Queue[MAXNODE]; int front,rear; if(bt==NULL) return; front=-1;rear=0; queue[rear]=bt; while(front!=rear) { front++; visit(queue[front]-data); //访问队首结点的数据域 if(queue[front]-lchild!=NULL) //将队首结点的左子结点入队列 { rear++; queue[rear]=queue[front]-lchild; } if(queue[front]-rchild!=NULL) //将队首结点的右子结点入队列 { rear++; queue[rear]=queue[front]-rchild; } } } * 非线性结构 之 树 * 三种遍历输出序列的特点 前序:输出的第一个结点是树的根结点。 中序:根结点在输出序列中间的某个位置,在它的左边的序列全部是左子树的结点,在它右边的序列全部是右子树的结点。 后序:最后一个输出的结点是根结点。 推想:有了根结点再加上中序序列,我们就可以区分左子树和右子树。 * 非线性结构 之 树 * 二叉树的其它常见运算 在二叉树中查找具有给定值的结点 BiTree findnode(BiTree *boot, elemtype x) { BiTree *p; p = boot; if ( p == NULL) return(NULL); else if ( p-data == x) return(p); else return( findnode(p-LChild)|| findnode(p-RChild) );} * 非线性结构 之 树 * 二叉树的其它常见运算 求二叉树的深度 int treehigh(BiT
文档评论(0)