【二叉树】最大二叉搜索子树练习题

**有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.

给定二叉树的头结点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;
    }
}

猜你喜欢

转载自blog.csdn.net/Super_white/article/details/82467021