是不是 把P的节点先弹出来啊 然后P取的节点的值 才能够指向右子树
,除了根结点,难道你还能从其他地方找到右子树的地址?
是不是 把P的节点先弹出来啊 然后P取的节点的值 才能够指向右子树
,除了根结点,难道你还能从其他地方找到右子树的地址?
#define size 100
#define false 0
#define true 1
/*二叉树的二叉链表结点结构定义*/
typedef struct node
{
DataType data;
struct node * LChild;
struct node * RChild;
}BiTNode,*BiTree;
/*栈的顺序存储结构定义*/
typedef struct
{
stackelemtype elem[size];
int top;
}seqstack;
/*栈的初始化*/
void intistack(seqstack *s)
{ /*构造空栈s*/
s->top==-1;
}
/*进栈*/
int push(seqstack *s,stackelemtype x)
{
if(s->top==size-1)
return(false);
s->top++;
s->elem[s->top]=x;
return(true);
}
/*出栈*/
int Pop(seqstack *s,stackelemtype *x)
{
if(s->top==-1)
return(false);
else
{
*x=s->elem[s->top];
s->top--;
return(true);
}
}
/*检测链表是否为空*/
int isempty(seqlist s)
{
if(s->top==-1)
return(true);
else
return(false);
}
/*中序遍历二叉树的非递归算法(调用栈操作的函数)*/
void InOrde(BiTree root)
{ seqstack s;
bitree p;
InitStack(&s);
p=root;
while(p!=NULL||!IsEmpty(s))
{
if(p!=NULL)
{
Push(&s,p);
p=p->LChild;
}
else
{
Pop(&s,&p);
visit(p->data);
p=p->RChild;
}
}
}
这是楼上建议 我就按照意思 把函数的全部调用写了
现在我明白了 谢谢各位大哥的支持
非常感谢 ttaix 和 asmseeker让我明白了栈和中序遍历二叉树的非递归算法
这里还有个 goto 的用法
中序遍历二叉非递归算法初步
/*二叉树的二叉链表结点结构定义*/
typedef struct node
{
DataType data;
struct node * LChild;
struct node * RChild;
}BiTNode,*BiTree;
/*s[m]表示栈,top表示栈顶指针*/
void InOrde(BiTree root)
{ int top=0;
bitree p=root; /*遍历左子树*/
L1:if(p!=NULL)
{
top=top+2;
if(top>m) return; /*栈满溢出*/
s[top-1]=p; /*本层参数进栈*/
s[p]=L2; /*返回地址进栈*/
P=P->LChild; /*给下层参数赋值*/
goto L1; /*转向开始*/
L2:Visit(p->data); /*访问根*/
top=top+2;
if(top>m) return; /*栈满溢出处理*/
s[top-1]=p; /*遍历右子树*/
s[top]=L3;
p=p->RChild;
goto L1;
}
L3:if(top!=0)
{
addr=s[top];
p=s[top-1]; /*取回返回地址*/
top=top-2; /*退出本层参数*/
goto addr;
}
}
我看了思路理不清 还请帮一下忙 能够帮我解析一下这个思路是怎么进行的
特别是 goto 和加红的地方