1 / 2
文档名称:

二叉树遍历的非递归算法.doc

格式:doc   大小:28KB   页数:2页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

二叉树遍历的非递归算法.doc

上传人:wxc6688 2020/11/1 文件大小:28 KB

下载得到文件列表

二叉树遍历的非递归算法.doc

文档介绍

文档介绍:二叉树遍历的非递归算法1:先序遍历的非递归算法需要设计栈:保留结点的位置用于查找右孩子入栈:访问结点之后要做入栈操作出栈:某结点的左子树访问完毕之后思路:①栈初始化,p初始化②栈不空或p不为空a:若p不空:访问p所指结点,p入栈,修改p,p=p->lchild否则b:若栈不空:出栈→p,求p的右孩子p=p->rchild算法:VoidPreorder(BiTreet){//二叉树先序遍历非递归算法p=t;InitStack(s);while(p||!StackEmpty(s))if(p){printf(p->data);Push(s,p);p=p->lchild}else{Pop(s,p);p=p->rchild}}改进算法:入栈查找右孩子,可以直接让右孩子入栈2、中序遍历的非递归算法需要设计栈:保留结点的位置用于查找右孩子,访问该结点入栈:访问左子树之前要做入栈操作出栈:某结点的左子树访问完毕之后思路:①栈初始化,p初始化②栈不空或p不为空a:若p不空:p入栈,修改p,p=p->lchild否则b:若栈不空:出栈→p;访问p所指结点,求p的右孩子p=p->、后序遍历的非递归算法需要设计栈:保留结点的位置用于查找右孩子,访问该结点入栈:访问左子树之前要做入栈操作;访问右子树之前要做入栈操作出栈:某结点的左子树访问完毕之后;某结点的右子树访问完毕之后思路:①栈初始化s1,s2,p初始化②栈不空或p不为空若p不空:p入s1栈,0入s2栈,修改p,p=p->lchild否则栈不空:出栈s1→p;出栈s2→tagtag=0:p入s1栈,1入s2栈,修改p,p=p->rchildtag=1:访问p所指结点,修改p,p=NULLVoidPostorder(BiTreet){//二叉树后序遍历非递归算法p=t;InitStack(s1);InitStack(s2);while(p||!StackEmpty(s1)){if(p){Push(s1,p);Push(s2,0);p=p->lchild}else{Pop(s1,p);Pop(s2,tag);if(tag==0){Push(s1,p);Push(s2,1);p=p->rchild}else{printf(p->data);p=NULL;}}}}