化底妆的正确步骤视频:二叉树的非递归遍历?要有讲解 不要纯程序~!!

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/02 21:41:24

我尽量写得详细一点,你再回去自己举个例子应该就容易明白了,这个遍历采用的是中序遍历.
struct node{
int data;
struct node *lchild;
struct node *rchild;
}/*定义结点,lchild和rchild分别为左右孩子*/
void inorder(struct node *T)
{
struct node *stack[100],*p;/*此处定义一个栈,用来存储遍历过程中的结点,因此其类型也为struct node * ,定义一个指向结点
指针p是用来遍历一个结点的子树*/
int top=-1;/*top为栈stack中栈顶的位置*/
if(T!=NULL){
do{
while(p!=NULL)
{
stack[++top]=p;
p=p->lchild;
}/*到了这一步,p==NULL,此时也走到了这棵树的最左端*/
p=stack[top--]; /*从栈顶弹出叶结点*/
visit(p); /*访问这个叶结点,比如可以打印该结点的数据:printf("%d",p->data);也可以做别的*/
p=p->rchild; /*再到这个结点的右子树*/
}while(p!=NULL||top!=-1);}/*当p==NULL&&top==-1的时候就全部遍历了这棵树*/
}

想必你已经知道递归遍历的方法了吧。非递归遍历需要一个Stack来记录访问过的点。以Depth first search为例。

把tree root 放入stack
while(stack不为空) {
if(stack.peak().left != null) {
把left放入stack
}
else {
从stack里拿出一个node,并处理
node = stack.pop();
把right放入stack
stack.push(node.right);
}
}

你考虑一下怎么把recursive改写成while就差不多了

我这有一个软件专门讲解的
qq:8340036