二叉树前序遍历的递归算法演示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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^^^