试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法
代码思路:
要用栈解决先序遍历,我们首先要知道栈的性质和二叉树先序遍历的规则
栈最基本的就是先进后出
而二叉树先序遍历就是“根左右”
利用这两个性质,我们可以先将根结点入队。
接下来,只要栈不空,我们就出栈一个元素,然后先入右孩子,再入左孩子
(因为栈是先进后出,那我们遍历完根结点之后下一个是左孩子,然后才是右孩子。所以先让右孩子进,再让左孩子进,这样出来的顺序就是我们要的先左后右了)
举例说明:
代码如下:
typedef struct BiTNode{//二叉树定义
char data;
BiTNode* lchild;
BiTNode* rchild;
}BiTNode,*BiTree;
//栈用到的基本操作
void InitStack(SqStack* s);
int Push(SqStack* s,BiTree e);
void Pop(SqStack* s,BiTree* e);
int StackEmpty(SqStack s);
//二叉树的非递归前序遍历
void PreOrderTraverseNR (BiTree T){
SqStack s;//声明一个栈s
InitStack(&s);//初始化一下
Push(&s,T);//根节点入栈
while(!StackEmpty(s)){
BiTree p;//用于一会记录出栈结点
Pop(&s,&p);
printf("%c",p->data);
//先入右孩子再入左孩子
//后面出栈的顺序就是:先左后右
if(p->rchild){//右孩子不是NULL,入栈
Push(&s,p->rchild);
}
if(p->lchild){
Push(&s,p->lchild);
}
}
}