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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

班级姓名

======== 实习报告二“二叉树前序遍历的非递归算法”演示程序============ (一)、程序的功能和特点

程序通过键盘输入数据建立一个二叉树,通过递归算法与非递归算法两种方式用前序遍历法输出二叉树。

功能包括:

1.前序遍历方式建立二叉树

2.前序遍历的递归算法输出二叉树

3. 前序遍历的非递归算法(以栈完成)输出二叉树

(二)、程序的算法设计

“二叉树前序遍历的非递归”算法:

1.【逻辑结构与存储结构设计】

程序中的二叉树的逻辑结构为树状结构;

存储结构为链式存储

2.【基本操作设计】

程序的主要操作有:

判断栈是否为空

元素进栈(插入到栈顶,即将新节点插入到头部)

元素出栈(删除头结点)

以root为根建立二叉树(输入按前序遍历方式输入字符串)等

3.【算法设计】

(1)前序遍历方式建立二叉树

public BinTreeNode preOrderCreate ( BinTreeNode p,String s)

{

得到输入字符串第i位的字符item;

如果item不是参照值(此程序为”∧”)

{

1、生成根结点;

2、把根结点的左指针作为新的根结点指针,递归调用自身生成左子

树;

3、把根结点的右指针作为新的根结点指针,递归调用自身生成右

子树;

}

否则,封闭叶子节点。

}

(2)前序遍历的递归算法输出二叉树

public void preOrderTraverse (BinTreeNode p) {

如果根节点不为空{

1、输出根节点的数据域

2、把根结点的左指针作为新的根结点指针,递归调用自身

输出左子树

3、把根结点的右指针作为新的根结点指针,递归调用自身

输出右子树

}

}

(3)前序遍历的非递归算法输出二叉树

void PreOrder(BinTreeNode p) {

若根节点的不为空(循环访问){

输出根节点的值

如果右子树不为空{

右子树的地址进栈

}

如果左子树不为空{

当前指针指向左子树

}

否则若栈空则打断循环(右子树地址出栈即当前指针指向右

子树)

}

}

4.【高级语言代码】

(1)前序遍历方式建立二叉树

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

}

(2)前序遍历的递归算法输出二叉树

public void preOrderTraverse (BinTreeNode p){

if ( p != null ){ //输出根结点数据域

System.out.print(" "+p.GetData());

//递归输出p的左子树

preOrderTraverse ( p.leftChild );

//递归输出p的右子树

preOrderTraverse (p.rightChild );

}

}

(3)前序遍历的非递归算法输出二叉树

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) break;

//出栈, 意味p指向右孩子结点,

//如果栈空,则遍历结束。

} //循环,访问当前结点

}

(四)、程序的输入输出和运行结果截屏

输入:abc^^fr^h^^q^^^

相关文档
最新文档