3.4找到二叉树中的最大搜索二叉子树

版权声明:本文采用 知识共享署名4.0 国际许可协议进行许可。 https://blog.csdn.net/youmian6868/article/details/89187408
题目

给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这棵子树的头节点。

代码实现
public TreeNode biggestSubBST(TreeNode head) {
    int[] record = new int[3];

    return posOrder(head, record);
}

//整体过程是后序遍历
public TreeNode posOrder(TreeNode head, int[] record) {
    if (head == null) {
        record[0] = 0;
        record[1] = Integer.MAX_VALUE;
        record[2] = Integer.MIN_VALUE;

        return null;
    }

    int value = head.value;
    TreeNode left = head.left;
    TreeNode right = head.right;

    TreeNode lBST = posOrder(left, record); //左子树上最大搜索二叉树的头节点
    int lSize = record[0];
    int lMin = record[1];
    int lMax = record[2];

    TreeNode rBST = posOrder(right, record); //右子树上最大搜索二叉树的头节点
    int rSize = record[0];
    int rMin = record[1];
    int rMax = record[2];

    record[1] = Math.min(lMin, value); //最小值
    record[2] = Math.max(rMax, value); //最大值

    //以node为头的整棵树都为搜索二叉树
    if (left == lBST && right == rBST && lMax < value && value < rMin) {
        record[0] = lSize + rSize + 1; //节点数

        return head;
    }

    //以node的左子树或者右子树为头的子树为搜索二叉树
    record[0] = Math.max(lSize, rSize); //节点数

    return lSize > rSize ? lBST : rBST;
}

猜你喜欢

转载自blog.csdn.net/youmian6868/article/details/89187408