jquer each 遍历的结果不显示 null_6.3 二叉树的遍历与线索化(2)

c0e880f81d7b177fdf2971c6f0a6eab1.png

返回目录:

Chilan Yu:《数据结构》目录链接​zhuanlan.zhihu.com
2008b43927ede12ceb72d3b93267766a.png

6.3.2 遍历算法应用

1. 输出二叉树中的结点

可以用三种遍历算法中的任何一种完成,只需要将访问操作具体变为输出操作即可。

/*先序遍历输出二叉树中的结点(根左右)*/
/*中序遍历输出二叉树中的结点(左根右)*/
/*后序遍历输出二叉树中的结点(左右根)*/

2. 输出二叉树中的叶子结点

输出二叉树中的叶子结点与输出二叉树中的结点相比,它是一个有条件的输出问题,即在遍历过程中走到每一个结点时需进行测试,看是否满足叶子结点的条件

/*先序遍历输出二叉树中的叶子结点(根左右)*/
/*中序遍历输出二叉树中的叶子结点(左根右)*/
/*后序遍历输出二叉树中的叶子结点(左右根)*/

3. 统计叶子结点数目

【方法一】:

统计二叉树中的叶子结点数目并无次序要求,因此可用三种遍历算法中的任何一种完成,只需要将访问操作具体便为判断是否为叶子结点及统计操作即可

int 

【方法二】:

采用分治算法,如果是空树,返回0;如果只有一个结点,返回1;否则为左右子树的叶子结点数之和。

/*分治算法统计叶子结点数目*/

4. 建立二叉链表方式存储的二叉树

给定一棵二叉树,可以得到它的遍历序列;反过来,给定一个遍历序列,也可以创建相应的二叉链表。在这里所说的遍历序列是一种“扩展的遍历序列”,通常用特定的元素表示空子树。

例如:

87123bda10a1ddb2e0e6fda12f55b0fc.png

(1)图中的二叉树的“扩展的前序遍历序列”为:AB#DF##G##C#E#H##其中用’#’表示空子树。

/*用扩展先序遍历序列创建二叉链表*/

(2)图中的二叉树的“扩展的中序遍历序列”为:#B#F#D#G#A#C#E#H#,“扩展的后序遍历序列”为:###F##GDB####HECA其中用’#’表示空子树。

虽然书上说“你完全可以用中序或后序遍历的方式实现二叉树的建立,只不过代码里生成结点和构造左右子树的代码顺序交换一下。另外,输入的字符也要做相应的更改。”

但亲测无效。在网上找中序或后序拓展建树一直找不到。感觉没法用中序或后序啊,因为首先就没有根节点,哪里来的左右子树。

5. 求二叉树的高度

方法一】:

二叉树的高度(深度)为二叉树中结点层次的最大值,也可视为其左、右子树高度的最大值加1。

算法思想】:

设函数表示二叉树bt的高度,则递归定义如下:

  • (1)若bt为空,则高度为0
  • (2)若bt非空,其高度应为其左右子树高度的最大值加1
/*后序遍历求二叉树高度的递归算法*/

方法二】:

求二叉树的高度也可以用前序遍历的方式实现。

算法思想】:

二叉树的高度(深度)为二叉树中结点层次的最大值。设根结点为第一层的结点,所有h层结点的左、右孩子结点在h+1层,故可以通过遍历计算二叉树中的每个结点的层次,其中最大值即为二叉树的高度。

int 

6. 按树状打印二叉树

假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母,要求实现如下图的打印结果。

244ec036a53ece4c009ef347e4a49813.png

【算法思想】:

(1)二叉树的横向显示应是竖向显示的90°旋转。分析图片可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,由上而下顺序看,其输出的结点序列为CFEADB,这恰为逆中序顺序。解决二叉树的横向显示问题采用“逆中序”遍历框架,所以横向显示算法为先右子树、再根结点、再左子树的RDL结构。

(2)在这种输出格式中,结点的左、右位置与结点的层深有关,故算法中设置了一个表示当前根结点层深的参数,以控制输出结点的左、右位置,每当递归进层时层深+1。

/*按树状打印二叉树*/

ADDITION:

以上函数的调用:

int 

f462dc8bc727503d01a204530c270049.png

返回目录:

Chilan Yu:《数据结构》目录链接​zhuanlan.zhihu.com
2008b43927ede12ceb72d3b93267766a.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值