**有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.
给定二叉树的头结点root,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。**
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}*/
public class MaxSubtree {
public TreeNode getMax(TreeNode root) {
// write code here
if(root==null){
return null;
}
int[]ret=new int[3];
return postOrder(root,ret);
}
public TreeNode postOrder(TreeNode root,int[]ret){
if(root==null){
ret[0]=Integer.MIN_VALUE;
ret[1]=Integer.MAX_VALUE;
ret[2]=0;
return null ;
}
TreeNode lnode=postOrder(root.left,ret);
int lmax=ret[0];//0最大值,1最小值,2总结点数
int lmin=ret[1];
int lnum=ret[2];
TreeNode rnode= postOrder(root.right,ret);
int rmax=ret[0];
int rmin=ret[1];
int rnum=ret[2];
ret[0]=Math.max(rmax,root.val);
ret[1]=Math.min(lmin,root.val);
if(lnode==root.left&& rnode==root.right
&& lmax<root.val && rmin>root.val){
ret[2]=rnum+lnum+1;
return root;
}
ret[2]=Math.max(rnum,lnum);
return rnum>=lnum?rnode:lnode;
}
}