- 1、本文档共152页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
常常要求在树中查找具有某种特征结点或者对树中全部结点逐一
6.3遍历二叉树和线索二叉树 6.3.1 遍历二叉树 一、递归算法 在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题,即如何按某条有哪些信誉好的足球投注网站路径巡访树中的每一个结点,使得每一个结点均被访问一次,而且仅被访问一次。 遍历对线性结构是容易解决的,而二叉树是非线性的,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,从而便于遍历。 1、先序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)访问根结点; (2)先序遍历左子树; (3)先序遍历右子树。 用伪码表示: void PreOrder(T)//T是树根 { if(T为空)return; 访问T的元素; PreOrder(T的左子树); PreOrder(T的右子树); } 2、中序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)中序遍历左子树; (2)访问根结点; (3)中序遍历右子树。 用伪码表示: void InOrder(T)//T是树根 { if(T为空)return; InOrder(T的左子树); 访问T的元素; InOrder(T的右子树); } 3、后序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。 void PostOrder(T)//T是树根 { if(T为空)return; PostOrder(T的左子树); PostOrder(T的右子树); 访问T的元素; } 先序遍历的例子 PreOrder(T):先序遍历以T为根的树。 树的遍历的实现: 下面先建立一棵二叉树,然后给出中序遍历二叉树的递归算法。 #include iostream using namespace std; struct node {//树的结点结构。二叉链表表示法 int data; node *lchild,*rchild; }; void merge_tree(node *parent,node *lchild,node *rchild) {//将parent、lchild、rchild三个结点合并起来,形成树形结构 parent-lchild=lchild; parent-rchild=rchild; } ///////// node *create_node(int data) {//为data生成一个结点 node * p=new node; p-data=data; p-lchild=p-rchild=0; return p; } 相应写出中序遍历二叉树的算法。 void InOrderTraverse(node * t) { if(t!=0) { InOrderTraverse(t-lchild); coutt-data ; InOrderTraverse(t-rchild); } } void test_tree() {////////建立一棵树 node *a,*b,*c,*d,*e,*f,*g; a=create_node(1); b=create_node(2); c=create_node(3); d=create_node(4); e=create_node(5); f=create_node(6); g=create_node(7); merge_tree(e,0,g); merge_tree(d,e,f); merge_tree(b,c,d); merge_tree(a,b,0); //中序遍历,用以测试树是否建立 InOrderTraverse(a); coutendl; } 二、非递归算法 递归思想虽然可以很好地适应人的思维,利用它可以快速地设计出算法,但是它的执行效率却是相当的低,为了提高程序的执行效率,某些时候把递归的程序化为非递归的是很有必要的。 我们可以想象,递归程序通常都涉及到一个回溯的问题。比如在二叉树中,进行中序遍历时,刚开始是沿着左子树一直向下运行,直到左子树遍历完成,才去遍历根,然后是右子树。那么怎么样能够从下面的结点回到上面?在递归程序中由每一层递归中的变量保存,如果写成非递归程序,也需要有保存上面结点的位置,通常用栈来保存。 我们看一下中序遍历的非递归过程。 根据这样的分析过程可以写出如下的非递归算法: 非递归算法: ①定义一个栈S ②根结点T入栈s.push(T) ③while(1) { 如果s的栈顶元素为空,break(跳出循环) 否则,栈顶的左孩子入栈 } ④跳出循环是因为栈顶元素为空,所以栈顶元素出栈 ⑤此时如果栈空,算法结束 否
您可能关注的文档
- 山东电子信息产业十一五的规划.docx
- 山东省临沂市数学初中毕业和高中招生考试.doc
- 山东省单县民师代课表格.doc
- 山东省教育科学的规划课题.doc
- 山东省泰安市宁阳县宁阳一中高三第四次阶段性考试历史及的答案.doc
- 山东省职业的技能鉴定考生手册.doc
- 山东省青岛市初级中学学业水平模拟考试语文试题.docx
- 山东省考的资料分析题.doc
- 山东省菏泽市单县智能交通的规划初步的研究.docx
- 山东省高考英语阅读表达精选.doc
- 2023年江苏省镇江市润州区中考生物二模试卷+答案解析.pdf
- 2023年江苏省徐州市邳州市运河中学中考生物二模试卷+答案解析.pdf
- 2023年江苏省苏州市吴中区中考冲刺数学模拟预测卷+答案解析.pdf
- 2023年江苏省南通市崇川区田家炳中学中考数学四模试卷+答案解析.pdf
- 2023年江西省吉安市中考物理模拟试卷(一)+答案解析.pdf
- 2023年江苏省泰州市海陵区九年级(下)中考三模数学试卷+答案解析.pdf
- 2023年江苏省苏州市高新二中中考数学二模试卷+答案解析.pdf
- 2023年江苏省南通市九年级数学中考复习模拟卷+答案解析.pdf
- 2023年江苏省南通市海安市九年级数学模拟卷+答案解析.pdf
- 2023年江苏省泰州市靖江外国语学校中考数学一调试卷+答案解析.pdf
最近下载
- 市政道路开口施工方案样本.pdf
- 2024年社区工作者考试必背1000题题库附参考答案【模拟题】.docx VIP
- 教师竞选高级职称评选述职报告PPT.pptx VIP
- 海康磁盘阵列产品操作及说明书.pdf
- 安徽林海园林绿化股份有限公司招聘简章.doc
- 2024年小学一年级上学期语文期中考试试卷附答案(实用) .pdf VIP
- 2024年春江苏开放大学网络学习工具及应用第二次形考作业答案.docx
- 华东师大版八年级数学下册导学案.pdf
- 九年级英语Unit 4 I used to be afraid of the dark优秀教案.doc
- 深入探讨小学思政课课程改革创新txt.docx VIP
文档评论(0)