常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一.ppt 立即下载
2024-08-17
约4千字
约152页
0
518KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一.ppt

常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一.ppt

预览

免费试读已结束,剩余 147 页请下载文档后查看

10 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

6.3遍历二叉树和线索二叉树
6.3.1遍历二叉树
一、递归算法
	在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题,即如何按某条搜索路径巡访树中的每一个结点,使得每一个结点均被访问一次,而且仅被访问一次。
	遍历对线性结构是容易解决的,而二叉树是非线性的,因而需要寻找一种规律,以便使二叉树上的结点能排列在一个线性队列上,从而便于遍历。左子树1、先序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
用伪码表示:
voidPreOrder(T)//T是树根
{
if(T为空)return;
访问T的元素;
PreOrder(T的左子树);
PreOrder(T的右子树);
}2、中序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
用伪码表示:
voidInOrder(T)//T是树根
{
if(T为空)return;
InOrder(T的左子树);
访问T的元素;
InOrder(T的右子树);
}3、后序遍历二叉树的操作定义为:
若二叉树为空,则空操作;否则
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
voidPostOrder(T)//T是树根
{
if(T为空)return;
PostOrder(T的左子树);
PostOrder(T的右子树);
访问T的元素;
}先序遍历的例子


PreOrder(T):先序遍历以T为根的树。(1)对于空树(2)对于只有根结点的树(3)对于只有左子树的树(4)对于只有右子树的树(5)对于具有左子树、右子树的树(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解(6)对于结点更多的树,从上到下逐步分解树的遍历的实现:
	下面先建立一棵二叉树,然后给出中序遍历二叉树的递归算法。#include<iostream>
usingnamespacestd;
structnode
{//树的结点结构。二叉链表表示法
	intdata;
	node*lchild,*rchild;
};voidmerge_tree(node*parent,node*lchild,node*rchild)
{//将parent、lchild、rchild三个结点合并起来,形成树形结构
	parent->lchild=lchild;
	parent->rchild=rchild;
}
/////////
node*create_node(intdata)
{//为data生成一个结点
	node*p=newnode;
	p->data=data;
	p->lchild=p->rchild=0;
	returnp;
}相应写出中序遍历二叉树的算法。
voidInOrderTraverse(node*t)
{
	if(t!=0)
	{
		InOrderTraverse(t->lchild);
		cout<<t->data<<"";
		
		InOrderTraverse(t->rchild);
		
	}
}voidtest_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);
	cout<<endl;
	
}二、非递归算法
	递归思想虽然可以很好地适应人的思维,利用它可以快速地设计出算法,但是它的执行效率却是相当的低,为了提高程序的执行效率,某些时候把递归的程序化为非递归的是很有必要的。	我们可以想象,递归程序通常都涉及到一个回溯的问题。比如在二叉树中,进行中序遍历时,刚开始是沿着左子树一直向下运行,直到左子树遍历完成,才去遍历根,然后是右子树。那么怎么样能够从下面的结点回到上面?在递归程序中由每一层递归中的变量
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

常常要求在树中查找具有某种特征的结点,或者对树中全部结点逐一

文档大小:518KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用