哈哈~~
如果看过 上篇 递归中的一些容易忽略的小细节的盆友,脑暴你的还有哦。。。。
如题:给定一颗二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这颗子树的头节点。
本来,按照我非常简易的解题思路是,从根节点找起(顺着来)。
1.编写一个可以判断 该二叉树 是不是 搜索二叉树的函数,并返回 flag (用来表示是否为搜索二叉树),外加返回 总共包含多少个节点。
2.将这颗树,从根节点开始,以此 调用 步骤1。
3.然后 找到是搜索二叉树就,且节点最多的,结束。
思路应该没错,但是 步骤2 可能有很多重复查找的多余步骤。所以,我就查看了 左程云 的解法。
后序遍历,底部节点往上卷,用了数组,赋值 再 赋值,是的,我没有打错。绕上去。
看代码。。。
public class Node {
public int val;
public Node left;
public Node right;
public Node(int data) {
this.val = data;
}
}
public Node biggestSubBST(Node head){
int[] record= new int[3];
return posOrder(record,head);
}
public Node posOrder(int[] record,Node head){
if(head ==null){
record[0]=0;
record[1]=Integer.MAX_VALUE;
record[2]=Integer.MIN_VALUE;
return null;
}
int value=head.val;
Node left=head.left;
Node right=head.right;
Node lnod=posOrder(record,left);
int lsize=record[0];
int lmin=record[1];
int lmax=record[2];
Node rnod=posOrder(record,right);
int rsize = record[0];
int rmin=record[1];
int rmax=record[2];
//注释1:点睛之笔
record[1]=Math.min(lmin,value);
record[2]=Math.max(rmax,value);
//注释2:搜索二叉树的标志,比左节点大,比右节点小。讲的更严谨一点,比左节点 最大的 大,比右节点 最小的 小。
if(left==lnod && right==rnod && lmax<value && value <rmin){
record[0]=lsize+rsize+1;
return head;
}
record[0]=Math.max(lsize,rsize);
return lsize>rsize?lnod:rnod;
}
我在复写的时候 在注释2处 出错,仔细想了想,是自己 疏忽了 再次强调的话语。
注释1.真的是 点睛之笔,想到这里的灵活运用 算的上真正的了解的递归 以及 赋值 再赋值了。哈~~end