SqStack S; InitStack(S); BiTree p; p=T; BiTree q; while(p||!StackEmpty(S)) { if(p) { Push(S,p); p=p->lchild; } else { Pop(S,q); printf("%d ",q->data); p=q->rchild; } }
时间: 2024-02-05 13:02:48 浏览: 70
非递归先、中、后序遍历二叉树(C语言)
这段代码实现了二叉树的中序遍历非递归算法,具体实现过程如下:
1. 定义一个顺序栈S,初始化为空栈。
2. 定义一个指针变量p,初始时指向二叉树的根节点T。
3. 定义一个指针变量q,用于存储出栈的节点。
4. 循环执行以下步骤,直到栈为空且p为空:
a. 如果p不为空,则将p入栈,并将p指向其左子节点。
b. 如果p为空,则将栈顶元素出栈并输出,然后将p指向栈顶元素的右子节点。
下面是该算法的C语言实现代码:
```c
typedef struct BiTNode{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct{
BiTree data[MAXSIZE];
int top;
}SqStack;
void InitStack(SqStack &S)
{
S.top = -1;
}
bool StackEmpty(SqStack S)
{
if(S.top == -1)
return true;
else
return false;
}
bool Push(SqStack &S, BiTree x)
{
if(S.top == MAXSIZE-1)
return false;
S.data[++S.top] = x;
return true;
}
bool Pop(SqStack &S, BiTree &x)
{
if(S.top == -1)
return false;
x = S.data[S.top--];
return true;
}
void InOrderTraverse(BiTree T)
{
SqStack S;
InitStack(S);
BiTree p = T;
BiTree q;
while(p || !StackEmpty(S))
{
if(p)
{
Push(S, p);
p = p->lchild;
}
else
{
Pop(S, q);
printf("%d ", q->data);
p = q->rchild;
}
}
}
```
其中,BiTree定义了二叉树节点的结构体,data是节点的值,lchild和rchild分别是左右子节点的指针。MAXSIZE是栈的最大容量。该算法的时间复杂度为O(n),空间复杂度为O(h),其中h为二叉树的高度。
阅读全文