首页 遍历二叉树

遍历二叉树

举报
开通vip

遍历二叉树编写的方法:根据树中结点的遍历规律及顺序直接写出其非递归算法。 先序非递归算法 【思路】 假设:T是要遍历树的根指针,若T != NULL 对于非递归算法,引入栈模拟递归工作栈,初始时栈为空。 问题:如何用栈来保存信息,使得在先序遍历过左子树后,能利用栈顶信息获取T的右子树的根指针? 方法1:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。 方法2:访问T->data后,将T->rchild入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T->rchil...

遍历二叉树
编写的方法:根据树中结点的遍历规律及顺序直接写出其非递归算法。 先序非递归算法 【思路】 假设:T是要遍历树的根指针,若T != NULL 对于非递归算法,引入栈模拟递归工作栈,初始时栈为空。 问题:如何用栈来保存信息,使得在先序遍历过左子树后,能利用栈顶信息获取T的右子树的根指针? 方法1:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。 方法2:访问T->data后,将T->rchild入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T->rchild,出栈,遍历以该指针为根的子树。 【算法1】 void    PreOrder(BiTree T, Status ( *Visit ) (ElemType e)) {    // 基于方法一, 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图如右,当型循环 InitStack(S); while ( T!=NULL || !StackEmpty(S)){ while ( T != NULL ){ Visit(T->data) ; Push(S,T); T = T->lchild; } if( !StackEmpty(S) ){ Pop(S,T); T = T->rchild; } } } 【算法2】 void    PreOrder(BiTree T, Status ( *Visit ) (ElemType e)) {    // 基于方法二,流程图如右,当型循环 InitStack(S); while ( T!=NULL || !StackEmpty(S) ){ while ( T != NULL ){ Visit(T->data); Push(S, T->rchild); T = T->lchild; } if ( !StackEmpty(S) ){ Pop(S,T); } } } 进一步考虑:对于处理流程中的循环体的直到型、当型+直到型的实现。 中序非递归算法 【思路】 T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。 问题:如何用栈来保存信息,使得在中序遍历过左子树后,能利用栈顶信息获取T指针? 方法:先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。 【算法】 void    InOrder(BiTree T, Status ( *Visit ) (ElemType e)) {    // 流程图如右,当型循环 InitStack(S); while ( T!=NULL || !StackEmpty(S) ){ while ( T != NULL ){ Push(S,T); T = T->lchild; } if( !StackEmpty(S) ){ Pop(S, T); Visit(T->data); T = T->rchild; } } } 进一步考虑:对于处理流程中的循环体的直到型、当型+直到型的实现。 后序非递归算法 【思路】 T是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。需要判断根结点的左右子树是否均遍历过。 可采用标记法,结点入栈时,配一个标志tag一同入栈(0:遍历左子树前的现场保护,1:遍历右子树前的现场保护)。 首先将T和tag(为0)入栈,遍历左子树;返回后,修改栈顶tag为1,遍历右子树;最后访问根结点。 typedef struct stackElement{ Bitree    data; char        tag; }stackElemType; 【算法】 void    PostOrder(BiTree T, Status ( *Visit ) (ElemType e)) {    // 流程图如右,当型循环 InitStack(S); while ( T!=NULL || !StackEmpty(S) ){ while ( T != NULL ){ Push(S,T,0); T = T->lchild; } while ( !StackEmpty(S) && GetTopTag(S)==1){ Pop(S, T); Visit(T->data); } if ( !StackEmpty(S) ){ SetTopTag(S, 1);        // 设置栈顶标记 T = GetTopPointer(S);    // 取栈顶保存的指针 T = T->rchild; }else break; } }
本文档为【遍历二叉树】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_834483
暂无简介~
格式:doc
大小:23KB
软件:Word
页数:5
分类:互联网
上传时间:2012-11-06
浏览量:26