二叉树前序遍历的递归算法演示程序.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
二叉树前序遍历的递归算法演示程序

班级 姓名 ======== 实习报告二 “二叉树前序遍历的非递归算法”演示程序 ============ 、程序的功能和特点 程序通过键盘输入数据建立一个二叉树,通过递归算法与非递归算法两种方式用前序遍历法输出二叉树。 功能包括: 前序遍历方式建立二叉树 前序遍历的递归算法输出二叉树 3. 前序遍历的非递归算法(以栈完成)输出二叉树 (二)、程序的算法设计 “二叉树前序遍历的非递归”算法: 1.【逻辑结构与存储结构设计】 程序中的二叉树的逻辑结构为树状结构; 存储结构为链式存储 2.【基本操作设计】 程序的主要操作有: 判断栈是否为空 元素进栈(插入到栈顶,即将新节点插入到头部) 元素出栈(删除头结点) 以root为根建立二叉树(输入按前序遍历方式输入字符串)等 3.【算法设计】 前序遍历方式建立二叉树 public BinTreeNode preOrderCreate ( BinTreeNode p,String s) { 得到输入字符串第i位的字符item; 如果item不是参照值(此程序为” ∧”) { 1、生成根结点; 2、把根结点的左指针作为新的根结点指针,递归调用自身生成左子 树; 3、 把根结点的右指针作为新的根结点指针,递归调用自身生成右 子树; } 否则,封闭叶子节点。 } 前序遍历的递归算法输出二叉树 public void preOrderTraverse (BinTreeNode p) { 如果根节点不为空{ 1、输出根节点的数据域 2、把根结点的左指针作为新的根结点指针,递归调用自身 输出左子树 3、把根结点的右指针作为新的根结点指针,递归调用自身 输出右子树 } } 前序遍历的非递归算法输出二叉树 void PreOrder(BinTreeNode p) { 若根节点的不为空(循环访问){ 输出根节点的值 如果右子树不为空{ 右子树的地址进栈 } 如果左子树不为空{ 当前指针指向左子树 } 否则若栈空则打断循环(右子树地址出栈即当前指针指向右 子树) } } 【高级语言代码】 前序遍历方式建立二叉树 int is=0; //串s的下标,成员变量,避免回溯。 public BinTreeNode preOrderCreate ( BinTreeNode p,String s) { char item=s.charAt(is++); //得到串s的第is个字符 if ( item != RefValue ){ //读入的不是参照值 p=new BinTreeNode(item); //递归生成左子树 p.leftChild=preOrderCreate(p.leftChild,s); //递归生成右子树 p.rightChild=preOrderCreate(p.rightChild,s); //实参是空二叉树,得到返回的子二叉树 } else //读入的是参照数 p=null; //封闭叶子结点 return p; //返回二叉树p } 前序遍历的递归算法输出二叉树 public void preOrderTraverse (BinTreeNode p){ if ( p != null ){ //输出根结点数据域 System.out.print( +p.GetData()); //递归输出p的左子树 preOrderTraverse ( p.leftChild ); //递归输出p的右子树 preOrderTraverse (p.rightChild ); } } 前序遍历的非递归算法输出二叉树 void PreOrder(BinTreeNode p) { //定义栈(栈的数据类型是二叉树结点指针) cLinkStack S=new cLinkStack(); //空栈 //从当前结点开始遍历访问 while ( p!=null) { //访问根结点 System.out.print( +p.GetData()); //预留右孩子地址在栈中 if ( p.rightChild != null ) S.Push ( p.rightChild ); //若有左孩子,当前指针指向左孩子 if ( p.leftChild != null ) p = p.leftChild; else if((p=S.Pop())==null

您可能关注的文档

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档