2019/10/28 03-习题打印树和二叉树遍历

在这里插入图片描述
这样切,每个都是居中打印在这里插入图片描述
假如第一行是15个单位,把它除以2就可以了
在这里插入图片描述
7的居中打印,,刚好是7//2=3
每次居中打印刚好减半
在这里插入图片描述
用居中打印和递归都可以

每次居中打印刚好减半,上面4段,下面8段,每次在上面除以2即可

另一种思路是,是算间隔数,前面7个单位,中间1个,后面7个总共就是15个单位,三角代表3个
在这里插入图片描述
如果是4层满二叉树,2 的4次方-1=2^4-1=16-1 =15,
但是现在是完全二叉树
从上面打光下来,在底上这条线上可以看到多少个数,完全二叉树是15个
在这里插入图片描述
要是撑满每一行是15个格子在这里插入图片描述
前7后7,+1 刚好15个,只不过这15个互相不重叠在这里插入图片描述
思路无非就是看总的空数,然后往下减算它的间隔数
还有一种
在这里插入图片描述在这里插入图片描述
后面可以给空格也可以不管
中间空格就可以解决了
在这里插入图片描述
这样就可以解决间隔
在这里插入图片描述
每一行数有几个就可以认为是2的次方
第一行 2的0次方,2^0
第二行 2的1次方,2^1
第三行 2的2次方 4
在这里插入图片描述
uint_with是,因为,现在数字是两位数,前面的空格式7个单位的空格,就是2位数为一个单位在这里插入图片描述
在这里插入图片描述在这里插入图片描述
length算一下长度
depth是向下取整,math.ceil是以2为底的,显示当前打印是4层

在这里插入图片描述
算出来总共能打印多少个 2^4-1=15
在这里插入图片描述
4层遍历4次
2
i正好取数用**
在这里插入图片描述
下面就是取这个东西,第一次取1个,第二次1取2个,就是计数
给个index,一直向后跑就可以 index+=1,

在这里插入图片描述
索引从0开始,等于length的时候就退出了
在这里插入图片描述
关键里面怎么打,把数字30拿到后,在什么里面打印,首先外面{}大括号,表示打的是谁
^代表居中打印 15个数字单位宽度,在15个中间打印数字,27=14+1,第一次15没什么问题
**
在这里插入图片描述
后面就要加空格,因为下一回算出来是3个,3个有点问题
在这里插入图片描述
15//2=7
在这里插入图片描述
第一次这里是7
在这里插入图片描述
回头,现在是在7的宽度中居中打印,前 3后3
在这里插入图片描述
下面是1 进来,还是前3后3打印,但是有个问题,中间丢了个1,需要补东西在这里插入图片描述
就需要在这里补,为下一个数衔接补,然后再前3后3,中间排一个,不然会发现打印的时候发生错位在这里插入图片描述
7//2=3,也可以居中打以此类推在这里插入图片描述
执行一下在这里插入图片描述在这里插入图片描述
第二种思路
在这里插入图片描述
加一下
在这里插入图片描述
这个可以理解为,空格间隔几个合适的问题,
第一行7个单位,中间一个单位,后面7个单位
第二行,3+3+1+3+3
总的长度都是15
在这里插入图片描述
1第一个间隔是7,
2第二个间隔是3,中间间隔是7
3第三个间隔是1,中间间隔是1+1+1=3
4最后中间间隔只有1个数
在这里插入图片描述
下面玩数字游戏,但你是1的时候,想要变成多少
1234,的迭代方式改成3210,range(3,-1)发现这一块有想要的东西

在这里插入图片描述
**查看有什么规律
索引是3210,
7是2
3-1
3=22-1
1=2
1-1
前空格写成这样就特别方便
主要是后面部分

j在这里插入图片描述
后面这一块怎么处理就需要打问号?了
0
7

在这里插入图片描述
这样就得到了跟前面的值相关的东西
前空格数跟i相关,元素间跟前空格相关

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在前面补0是有好处的,30的索引是从1开始
在这里插入图片描述
这是一个单位的间隔
在这里插入图片描述**、pre第一次是刚好是7
然后打印前空格,打印7个单位空格
下面取元素
offset,,(两种方式自己写一个index,用一个元素+1)
(index:index+offset,走到哪了,这一层偏移几个你应该知道)
第一次拿30,第二次拿20,80
**在这里插入图片描述
接下来就是打间隔数,空格数等于前面的空格数*2+1,间隔数有了下面就join一下就好了,join要求str才可以
在这里插入图片描述
把这一行拿到了,把前面的空格搞定,剩下就靠间隔空格拼在一起在这里插入图片描述
运行一下
在这里插入图片描述
**也是推算空格数,如果发现用i计算非常麻烦,看见循环变量怎么写才方便,有的时候正着写确实不方便,就可以倒着来 **在这里插入图片描述
打印树就是为了引出讲的树的概念在这里插入图片描述
在这基础上做堆排序
树如果没有节点就是空树
如果是有节点的就是有节点的树,加上连线,就是关联关系
树的根节点,没有前驱,但是可能有后继
一个数每一个节点,除了根节点之外,其他的节点只能有一个前驱,可以有多个后继
在这里插入图片描述
二叉树的后继是最多2个,二叉树是一颗有序的树(意味左子树和右子树不能随意颠倒顺序)在这里插入图片描述
遍历是把所有元素不重复拿取一遍
迭代所有元素就是迭代所有节点

在这里插入图片描述
面试非常爱问,广度优先遍历,深度优先遍历
碰到一个目录立马钻进去就是深度优先,
碰到一个目录,先不处理,把一层的都 处理了叫广度优先遍历

在这里插入图片描述
**广度优先遍历,讲层序遍历)
深度优先遍历,(前序遍历,中序遍历,后序遍历)
把所有元素不重复地访问一遍就是遍历,就有一个访问的前后次序,当按照一定规则访问完后,把元素一排其实是个有序序列,这个叫遍历序列
遍历序列非常重要,是将一个非线性结构变成一个线性结构,树是一个非线性结构,但是遍历就是按照一定顺序,变成一个线性结构,
遍历是从非线性结构到线性结构
**
看一下层序遍历
在这里插入图片描述
层序遍历 按照树的层次,从第一次开始,自左向右遍历元素
遍历序列
:ABCDEFGHI

下面几个遍历比较麻烦在这里插入图片描述
深度优先遍历,
设树的根结点为D,左子树为L,右子树为R,且要求L一定要R之前(要求左子树一定 在右子树之前),则有下面几种遍历方式:
前序遍历,也叫先序遍历,也叫先根遍历,DLR
中序遍历,也叫中跟遍历,LDR
后序遍历,也叫后根遍历,LRD

考数据结构,树是必考项目
在这里插入图片描述
**前序遍历,,DLR
先根结点开始,先左子树后右子树
每个子树内部依然是先根结点,再左子树,后右子树。递归遍历
遍历序列
A BDGH CEIF(A有空格,左子树和 右子树断开
一般都是从根结点进的,根节点是A,先根
**
在这里插入图片描述
A是跟,左子树的根是B,然后D是下面的跟,问D有没有左子树,有就是G,G没有左子树且没有右子树,这时候就要打它的右子树H
A BDGH

现在打完了 问B有没有右子树,这时候问A,左子树打完了,有没有右子树,右子树之后先到C,到了C,就问 它的左子树,CEI,左子树,I打印出来,问I有没有右子树,没有就向上问E,有没有右子树,到F
**先根再左再右,先走根A,由A先左子树,然后左子树的根是B,B先左后右,它的左子树是D,然后D的左子树是G
没有左子树就问右子树是谁,就是H
然后打完了到A的右子树,
这样C下面的左子树就是E,I跟节点,I没有右结点,就问E有没有又右,继续问C有没有右子树,最后打印F
**
在这里插入图片描述

中序遍历

在这里插入图片描述
中序遍历LDR
从根节点的左子树开始遍历,然后是根节点,再右子树
每个子树内部,也是先左子树,后根结点,再右子树。递归遍历
遍历序列:
左图 GDHB A IECF
右图 GDHB A EICF

**根是放在中间打的
遇到A,A是根不能从这走,先左后右,到达左子树B,然后B还有左子树,就到了D,D还有左子树就是G,G没有左子树也没有右子树,就从这开始,所以现在箭头划到G
从G开始,左右子树加它自己都打印完了,只能打印出来G
g打印出来,接下来就是D,左子树打印完了,先左后中再右,该打D了,G打完打D
打完D,右子树H给你了,H打印,看看H有没有左子树,没有就打自己H,H之后,问H有没有右子树,H没有右子树,
DH都没有。然后B,B没有右子树,就不打了
现在左子树终于打完了,
先左后中,该打A了,打完A,打右子树
右子树也是先左后根后右
需要一步从左到底,C有左子树E,E有右子树I,EI,打完I问有没有右子树,就轮到c,终于该打F,如果有左子树就轮不到F了,F只有一个就轮到F 了
**

看右图
从G开始,GDHB A 是跟前面一样
到右子树问C,C的左子树是E,E没有左子树有右子树,没有就轮到E,E结束后,(左根右),右子树I,I完了就等于E形成的子树就结束了,就到C,C的左子树打印完了,C就是根,轮到C了,C完了就是F
这就是中跟遍历

在这里插入图片描述
不管怎么遍历A都是在中间在这里插入图片描述在这里插入图片描述
后序遍历就是跟放最后去
先左子树,后右子树,再根节点
每个子树内部依然是先左子树,后右子树,再根结点。递归遍历
遍历序列
GDHB IEFC A

先左后右再根,一路靠左就到G,G节点没有右,G下面H,问H,问D,左右都打过了,该轮到自己D,然后轮到B,左打完了,B没有右,终于可以打印B了
这时候对于A来将左子树打印完了,A最后,所以下面到了A的右子树,
也是先左后右,一路到了I,I旁边没有右子树,该打E了,C的左子树打印完了,就轮到C的右子树F了,打完之后才轮到C这个跟,C打印完,对于A,右子树打印完了,然后终于轮到A了,这是后序遍历,后根遍历
这是深度优先度,一路向下

在这里插入图片描述
广度就是ABCDEFCGHI在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值