算法体系结构第十二课

一、完全二叉树的判断
第一种方法:
1.流程:
(1) 按层遍历,如果一个结点左孩子为空右孩子不为空,返回false,
(2)当遇到第一个不满的结点时,后面的结点需要全是叶子结点,
(3)不为空就把孩子加到队列里,
(4)如果不满,leaf设置为true;

2.code:
代表“是否遇到了不满”的boolean类型的变量leaf设为false;
满足上述条件任意一个条件的,都返回false,

if (
                            (l == null && r != null)
                            ||
							leaf && (l != null || r != null)
            ) 
 leaf像一个开关,打开了就不关闭
   第二个条件:(是的,不满) && 不是叶子结点,因为一开始是满的,leaf为false(!是满的),即第二
 个条件没法触发,一直起作用的是第一个条件;
   在遍历到第一个不满的结点时,其实还是认为它是满的(leaf == false),所以第二个条件直接跳过了,
 起作用的其实是第一个条件,在后面因为它是不满的,所以leaf置为true,而以后的结点就都要是叶子结点
 了,也就是第二个条件在起作用

第二种方法:(树形dp)
1.信息类的设置:高度,是否满,是否完全;
2.递归函数设置:
(1)按照基本套路,判空,收集左右子树的信息,设置自己的高度,
(2)再判是否满:左满右满,俩子树一样高,
(3)满就完全,如果不满,并且左右都是完全的,则:
A.左满右不满,那左树的高度一定比右树多1;
B.右满左不满,那俩树一定一样高;
C.左满右也满,(一样高就成满二叉树了)左数高度一定比右树大1;

二、判断是否是搜索二叉树
1.挫办法
中序遍历,如果得出的序列是从小到大排序的,就是搜索二叉树;

2.好办法
(1)信息类:是否BST,这棵树上的最大最小值;
(2)递归函数:
A.如果结点是空,不好设置最大最小值,

因为如果最值全都设置为0,那叶子结点会把最小值也更新成0,如果是负数的话,还会把最大值更新成0

所以返回空,选择在上游进行空信息的处理;

B.搜集左右信息,以该节点的值为标称值,设置最值,

C.设置isBST,也需要小心判断空信息:
左或右不搜就false,左最大值大于等于结点值、右最小值小于等于结点值 就false;

三、平衡二叉树的判断
1.树型dp
(1)信息类:高度、是否平衡
(2)递归函数:写不出来就进电子厂吧你

2.地址传递进行判断
通过传递一个布尔类型、大小是1的数组,对二叉树进行平衡的判断,递归函数返回该树的高度,以方便收集左右子树的高度

四、满二叉树的判断
1.获得树的高度和总结点数,满二叉树满足 2^height - 1 = nodes 这样的关系;

它是 2^(2 - 1) = 2;
System.out.println(1 << 2 - 1);

它是 2^2 - 1 = 3;
System.out.println((1 << 2) - 1);

2.树型dp
只要左右是满的并且左右的高度相等即可;

五、求树中距离最远的两个点的距离(两个点之间包含了包含他们在内的多少个点)

1.树形dp
(1)信息类
高度与最远距离

(2)递归函数
有可能左树里包含着最长路径,有可能右树里包含着最长路径,他们都不经过头结点;
有可能最长路径经过了头结点,所以有三种可能:左最长路径或右最长路径或左右树高 + 1,三种求最大值即可;

2.暴力方法
(1)获取树的先序遍历
(2)获得指向结点的父节点的指针,以哈希表的形式存储
(3)获取任意两个结点的距离,求最大值:
A.通过父指针,用set从选定的结点开始向上边遍历边存储;
B.如果另外一个结点没有在这条边上,那就用同样的方式,通过set找到它所在的边界和另一结点的交点
C.两结点向着这个交点走,测出距离

注意:距离是这条路径上的结点的数量,应该从1开始计数

六、最大搜索二叉树的大小
1.树形dp
(1)信息类:最大BST的大小,最值,大小(结点数)
(最大BST尺寸 = 自身尺寸时,这棵树就是BST)
(2)递归函数
A.如果是空,最值不好设置,不好打包成信息类进行返回,就返回空;
B.收集左信息和右信息;
C.不空时,设置最值和树的大小;
D.总共有三种可能性,要么最大BST不经过头结点,就在它的左右子树中,两种可能,要么最大BST就是整棵树;

设置方法:让值先等于-1,当信息不为空时才赋值,这样,就算对应的信息为空,在最后比较的时候也会落败

E.第三种情况的判断:
(i)如果信息是空的,那就认为是BST,非空才开始判断树的大小是否等于最大BST的大小,如果是,那它就是BST;
(ii)如果左右都是BST,判断左右的最值是否满足BST要求,但如果信息为空,就认为是真;
(iii)如果满足BST对左右最值的要求,左大小 + 右大小 + 1就是最大BST,但如果信息为空,那就把对应的大小设置为0;

2.挫办法
(1)获取头结点的BST大小,不为0就返回,为0就对左右孩子进行递归;
(2)对该节点进行中序遍历,不是递增就返回0,是就返回中序数组大小;

相当于对每一个结点进行中序遍历,不是BST就遍历左右子树
类似于一种层序遍历
总结:
完全二叉树的判断
搜索二叉树的判断
平衡二叉树的判断
满二叉树的判断
树的最远距离
最大平衡二叉树

1.完全二叉树的判断
(1)按层遍历
(2)左空右不空、不满则后面全是叶子结点(开关)
(3)加入左右孩子
(4)是否打开开关

2.搜索二叉树的判断
(1)中序遍历
(2)信息类:isBST、最值
(3)分散判断

3.平衡二叉树的判断
(1)信息类:isBT、高度
(2)单元素数组

4.满二叉树的判断
(1)高度、是否满

5.树的最远距离
(1)信息类:高度、最远距离
(2)经不经过头结点

6.最大平衡二叉树
(1)信息类:最大BST尺寸、自身尺寸、最值
(2)节点为空时最值不好处理,所以在上层要小心处理
(3)最值、自身尺寸和前两种可能性的设置
(4)经过头结点的设置:
 A.左右BST的判断
 B.BST对于头结点最值的要求
 C.加值时对空信息的判断
 

请添加图片描述

Guess you like

Origin blog.csdn.net/dgytjhe/article/details/120265264