试利用栈的基本操作写出先序遍历二叉树的非递归形式的算法
代码思路:
要用栈解决先序遍历,我们首先要知道栈的性质和二叉树先序遍历的规则
栈最基本的就是先进后出
而二叉树先序遍历就是“根左右”
利用这两个性质,我们可以先将根结点入队。
接下来,只要栈不空,我们就出栈一个元素,然后先入右孩子,再入左孩子
(因为栈是先进后出,那我们遍历完根结点之后下一个是左孩子,然后才是右孩子。所以先让右孩子进,再让左孩子进,这样出来的顺序就是我们要的先左后右了)
举例说明:
代码如下:
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;//声明一个栈sInitStack(&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);}}
}