算法体系结构第十三课

一、完全二叉树的判断

第三种判断方法:用结点从左右是满的开始,填满下一层
(1)如果是满的,则左右高度相等或者左比右高1,
(2)如果左完全,右满,则左比右高1,
(3)如果左满右满,参考(1)
(4)如果左满右完全,左右高度相等
(5)如果左满右满,参考(1)

二、返回最大BST的头部

1.树型dp
和返回最大BST的尺寸类似,不过BST的判别条件改成了最大头部为本树的头

2.挫办法
(1)通过中序遍历获取当前结点的最大BST,如果非0,则返回该节点;
(2)如果为0,则用左右孩子调用当前函数,谁大返回谁

三、返回两结点的最低公共祖先(最年轻公共祖先)

1.挫办法
用一个表记住某一个结点以及它的所有祖先,让另一个结点也往上找,它的第一个包含在表里的祖先,就是最低公共祖先

2.dp

可能性:
(1)与某个结点x无关
A.左或右子树已经找到答案了
B.两个结点不是两个都在x的子树上
(2)与某个结点x有关
A.两个结点在x的子树上左右各一个
B.x本身就是两个结点其中一个

可能性的思考技巧:思考各个位置上的结点,看是否可以糅合到一个大的可能性当中

信息类:
是否找到结点a
是否找到结点b
答案结点

编程细节:
(1)是否找到a(/b)
A.该节点就是a,子树找到了a,
B.如果左右树已经有答案了,直接抓取答案,
C.如果没有,则判断是否找到了a和b

四、最大快乐值(按层间隔取该层的最大值)
1.dp
(1)可能性
对于头结点为x的树,有两种情况,x来和x不来,
x来,最大值为它的值与所有下属不来的值的和,
x不来,下属们爱来不来,最大值为每个下属来和不来中的最大值的和

(2)信息类
来,的最大值
不来的最大值

(3)编程
两种可能性,遍历下属们,写不出来就。。。

2.递归
传递一个上级是否来的参数
上级来,我就不来,我的下属们爱来不来,
上级不来,我就来,下属们地参数便是true;

五、返回把提供的字符串数组通过排列组合串在一起的最小字典序字符串

1.贪心算法
两个字符串的比较没有传递性,但两个字符串串起来和反着串起来的比较就有传递性

2.暴力递归
把字符串数组删去一个元素,剩下的元素排列组合,放在一张表里,把那些排列组合贴在这个元素的后面,贴一个,就放入set中,返回即可

public static class MyComparator implements Comparator<String> {
    
    
    @Override
    public int compare(String a, String b) {
    
    
        return a.equals("") ? -1 : b.equals("") ? 1 : (a + b).compareTo(b + a);
    }
}
public static String lowestString2(String[] strs) {
    
    
    if (strs == null || strs.length == 0) {
    
    
        return "";
    }
    Arrays.sort(strs, new MyComparator());
  String res = "";
    for (int i = 0; i < strs.length; i++) {
    
    
        res += strs[i];
    }
    return res;
}
该贪心策略有问题,在字符串数组中有空元素插进非空字符串元素间的时候,是不能够返回正确的字典序的
String[] strings = {
    
    "Dd", "ccBE", "BAD"};
String[] strings1 = {
    
    "Dd", "", "ccBE", "BAD"};
String[] strings2 = {
    
    "Dd", "", "ccBE", "", "BAD"};
String[] strings3 = {
    
    "", "Dd", "ccBE", "BAD"};
String s = lowestString2(strings);
String s1 = lowestString2(strings1);
String s2 = lowestString2(strings2);
String s3 = lowestString2(strings3);
System.out.println(s);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);

	输出结果:
	BADDdccBE
	DdBADccBE
	DdccBEBAD
	BADDdccBE

	原因:这种贪心策略落实的比较器,当传入的两个字符串中有一个是空时,(a + b)(b + a)相等,这
样,这两个字符串的相对位置就不会发生改变,当后面的字符串在与该空字符串进行比较时,也会因为相等,
相对位置不改变,所以在该空字符串的前后形成了断层,不能进行正确的比较,

	而正确的代码如下:
public int compare(String a, String b) {
    
    
    return a.equals("") ? -1 : b.equals("") ? 1 : (a + b).compareTo(b + a);
}

	当a为空时,返回-1,即将a放在前面,b也同理
	最后输出的结果:
	BADDdccBE
	BADDdccBE
	BADDdccBE
	BADDdccBE
总结

一、完全二叉树的第三种遍历
从满二叉树开始从左至右依次填满下一层

二、最大BST头部
isBST改为树的头结点和最大BST头结点相比较

三、返回两结点最低公共祖先
只有当左右子树都没有答案时,才判断是否左右各找到一个

Guess you like

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