问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

程序改错:非递归先序遍历二叉树

发布网友 发布时间:2022-05-15 23:27

我来回答

5个回答

热心网友 时间:2023-11-04 23:02

do
{
////while(p!=null)注意:当跳出循环的时候,p==null,那么下面的p->data访问非法
while(p->lchild)
{
s[top]=p;
top++;
p=p->lchild;
}
////if(top>0)注意,第一次栈空的时候,p指向树根,这时候应该输出树根,并继续遍历右子树
////因此,这个if不恰当
////下面面的语句,基本上算是重新写了,后边有代码分析
printf("%c\t",p->data);//中序遍历,只要没有左孩子就要输出
p=p->rchild;//访问右孩子
if(!p
&&
top>0)
{
////如果p没有右孩子,则是叶子结点,父结点出栈
top--;
p=s[top];
printf("%c\t",p->data);//它的左子树访问完了,输出自身(中序嘛)
p=p->rchild;//开始访问右子树
}
////如果有右孩子,就以它为树根,重新循环
////如果没有右孩子,且栈空(达到了下面一行的退出条件),说明树遍历完成,不能在进入if语句
}while(top>0||p!=null);
//-------------------------------------------------------------------------------
//------------------------------------------------------------------------------
////对你的代码做一下简要分析,上面提到的就不重复了
do
{
while(p!=null)
{
s[top]=p;
top++;
p=p->lchild;
}
if(top>0)
{
printf("%c\t",p->data);
top--;
p=s[top];
p=p->rchild;
}
}while(top>0||p!=null);
////举一个简单的例子,如图
////1
先假设你的while()循环访问正常,如果top改为>=0,那么势必造成top<0时访问s[],出错
////2
当if语句面的p=s[top]使得a出栈后,如果top>0没改,那么p就进入下一次循环,
////
while()将重新访问a的左孩子,貌似死循环了
////也就是说,你程序上面的错误导致你下面怎么改都不对,而一旦将上面该了,
////整个路线也基本算变了
////当然也可以按照课本p130的算法去改,大同小异

热心网友 时间:2023-11-04 23:02

建好树,用递归遍历试一下,看是否建树函数正确;如果正确,就是非递归遍历函数的问题

热心网友 时间:2023-11-04 23:02

#include<iostream.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 20

typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//创建结点的数据类型

typedef struct {
// BiTNode *base;
// BiTNode *top;
// int stacksize;
BiTree Elem[STACK_INIT_SIZE];
int top;
}SqStack;//存放结点的栈

void InitStack(SqStack &S);//构造空栈
void GetTop(SqStack &S,BiTree &q);//获取栈顶元素
bool StackEmpty(SqStack &S);//判断栈是否为空
void Push(SqStack &S,BiTree &q);//进栈
void Pop(SqStack &S,BiTree &q);//出栈
void CreatBiTree(BiTree &T);//创建二叉树
void PreOrderTraverse(BiTree &T);//非递归先序遍历二叉树

void main()
{
BiTree p;

CreatBiTree(p);
cout<<"先序遍历二叉树的非递归算法结果:"<<endl;
SqStack S;//创建存放结点的栈
InitStack(S);
Push(S,p);
while(!StackEmpty(S))
{
while((GetTop(S,p),p))
{
cout<<" "<<p->data;//访问结点
Push(S,p->lchild);//向左走到尽头
}
Pop(S,p);//空指针出栈
if(!StackEmpty(S))
{
Pop(S,p);
Push(S,p->rchild);
}
}
cout<<endl;
}

void CreatBiTree(BiTree &T)
{
char ch;
cout<<"输入一个结点后按回车:"<<endl;
cin>>ch;
if(ch=='@')
T=NULL;
else
{
if(!(T=new BiTNode))
exit(-1);
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}

void InitStack(SqStack &S)
{
// S.base=new BiTNode [STACK_INIT_SIZE];
// if(!S.base) exit(-1);
// S.top=S.base;
// S.stacksize=STACK_INIT_SIZE;
S.top=-1;
}

void GetTop(SqStack &S,BiTree &q){
if(S.top<=-1||S.top>=STACK_INIT_SIZE)
{cout<<"stack is empty";exit(0);}
else
{
q=S.Elem[S.top];
}
}

bool StackEmpty(SqStack &S){
if(S.top==-1)
return true;
else
return false;
}

void Push(SqStack &S,BiTree &q){
if(S.top>=STACK_INIT_SIZE)
{cout<<"stack is full!";exit(1);}
S.Elem[++S.top]=q;
}

void Pop(SqStack &S,BiTree &q){
if(S.top <=-1)
{cout<<"stack is empty!"; exit(-1);}
else
{
q=S.Elem[S.top--];
}
}

热心网友 时间:2023-11-04 23:03

太麻烦......

热心网友 时间:2023-11-04 23:04

学习。。
计算机二级c语言试题类型有哪些

11-20是基础的C知识 10分 1分/题 20-40是一些C的程序题 40分 2分/题 填空 15个(有可能一题中会让你填两个空) 30分 都是2分/题 前5题是 公共基础知识 10分 后面的十个空中可能会有5到6个读程序的题 笔试中基本不会有以前出过的题目,但题型一样,要是碰到以前一模...

计算机二级C 语言考什么?

6.树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。7.顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、程序设计基础 1.程序设计方法与风格 2.结构化程序设计。3.面向对象的程序设计方法,对象,方法,属性及继承与多态性。三、软件工程基...

二级C语言排序技术2

回答:很简单,对于笔试,多看看书书,对照书本多做做模拟题。机试那你要多上机练练,不懂的地方找一个会C语言的人请教一下。辅导书用南开100题比较不错,祝你好运!计算机二级C语言笔试有:公共基础知识 二级C,上机有:程序填空 程序改错 程序编译(这三题主要是应用函数调用)A 公共基础知识基本要求1.掌握算...

国家计算机二级C语言考试形式和具体题型,分值和笔试的复习方法_百度知 ...

6.树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。7.顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、程序设计基础 1.程序设计方法与风格。2.结构化程序设计。3.面向对象的程序设计方法,对象,方法,属性及继承与多态性。三、软件工程基...

c语言二级考试的大纲是什么?

6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。(前序、中序和后序遍历有考到,每年都有)7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、 程序设计基础1. 程序设计方法与风格。2. 结构化程序设计。3. 面向对象的程序设计方法,对象,方法,属性...

过计算机二级要考哪些内容?

6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、 程序设计基础 1. 程序设计方法与风格。2. 结构化程序设计。3. 面向对象的程序设计方法,对象,方法,属性及继承与多态性。三、...

...请各位帮帮我上机试题该怎么过啊?改错跟编程有什么规律不?_百度...

6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。(前序、中序和后序遍历有考到,每年都有)7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、 程序设计基础 1. 程序设计方法与风格。2. 结构化程序设计。3. 面向对象的程序设计...

C语言这个程序怎么设计

6.树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。7.顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、程序设计基础 1.程序设计方法与风格 2.结构化程序设计。3.面向对象的程序设计方法,对象,方法,属性及继 承与多态性。三、软件工程...

计算机二级可以笔试和上级主要考哪些方面

6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。(前序、中序和后序遍历有考到,每年都有)7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、 程序设计基础 1. 程序设计方法与风格。2. 结构化程序设计。3. 面向对象的程序设计...

计算机二级c语言考些什么?

6. 树的基本概念;二叉树的定义及其存储结构;二叉树的前序、中序和后序遍历。(前序、中序和后序遍历有考到,每年都有)7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。二、 程序设计基础 1. 程序设计方法与风格。2. 结构化程序设计。3. 面向对象的程序设计...

非递归中序遍历二叉树 二叉树后序遍历的非递归实现 二叉树的后序遍历非递归详细 二叉树前序遍历代码非递归 非递归中序遍历二叉树c语言 二叉树的中序遍历递归算法 二叉树先序遍历 二叉树先序遍历算法 二叉树的先序遍历代码
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
日本最厉害的神叫什么?形象又是什么样的? 我是1995年的,我是几岁上的小学啊? 95年大学毕业于哪一年几月份 1995年生的孩子几岁上小学,中学,高中 叶罗丽时辰砂兑换码大全 叶罗丽精灵梦礼包哪里领 礼包领取兑换地址大全 叶罗丽彩妆公主怎么玩_叶罗丽彩妆公主玩法大全 叶罗丽小游戏大全(叶罗丽小游戏大全换装游戏) 港式碗仔翅的烹饪秘诀有哪些呢? ...三个月的机械键盘有一些键失灵了 用回以前的键盘普通键盘就可以用... 股票在一个交易日里可以随便挂单撤单吗? 码字猫比Word好用吗? 有什么比Word更好的写作软件 小米电视3S 55寸SPDIF输出可以接功放吗 5173阿拉德之怒金币要同一服务区才行吗? 用瓷锅有什么好处? 怎么这么多阿拉德之怒服啊 电视接口spdif连接功放问题 阿拉德之怒安卓和iOS互通吗 安卓和iOS可以一起玩么 为什么小米手机自费换屏了后旧屏不让带走而且还从此以后就不给保修了呢 苹果售后更换下来的屏幕可以带走吗 阿拉德之怒安卓与ios版的能一起玩吗? 电视SPDIF数字音频输出怎样接功放 阿拉德之怒指挥官是哪个服 阿拉德之怒外服叫什么 如果我去手机官方维修店,更换下来的零件,可以拿回来吗? 请问有谁知道苹果公司有规定去苹果售后换屏,换下来的屏幕不可以自己带走吗?到底是有还是没我在啊? 阿拉德之怒哪个平台好 关于海伦凯勒的故事300字。 《海伦凯勒自传》内容简介(300字左右) 爱立熊连接不上怎么办 爱立熊怎么发社区 爱丽熊能打印彩色的吗 爱立熊打不出来字怎么办 爱立熊怎么连接小猿搜题 爱立熊错题打印机充电显示什么 爱立熊保存的错题去哪了 想买一个瑞士机芯女士手表,什么牌子的比较好呢?性价比比较高的,两千以内的.各位懂的推荐一下吧 古代唯美诗句,不要有关爱情,要短,没釆纳也必感谢 古风情诗短句 赤道加速度 江苏智慧金融服务有限公司怎么样? 怎样判断防爆冰箱延时固态继电器好坏? 为什么充电宝有两个Nl? 充电宝ln1是什么意思 防爆冰箱合格证代表型号是怎么样写的 充电宝一直充不进去电怎么回事 上边现实ln 购买防爆冰箱,需要厂家提供什么资质证明? 关于地球上物体随地球自转的,下列说法正确的是(  )A.在赤道上的向心加速度最大B.在两极上的向心加 给充电宝充电的插口上标着1N是什么意思?