力扣|105从前序和中序遍历序列构造二叉树106从后序和中序遍历序列构造二叉树|1373二叉搜索树的最大键值和

105从前序和中序遍历序列构造二叉树

方法思路:hashmap存中序列表(数和序号)优化时间复杂度,先得到根节点,然后递归创建左子树和右子树。
局部截取_20251103_145752

106从后序和中序遍历序列构造二叉树

同上题
局部截取_20251103_162343

1373二叉搜索树的最大键值和

点击查看代码
class Solution {
    private int maxSum = 0;
    public int maxSumBST(TreeNode root) {
        dfs(root);
        return maxSum;
    }
    private int[] dfs(TreeNode root){
        //空子树(是1,和0,空子树最小值是整数最大值,空子树最大值是整数最小值)这里的顺序其实无所谓,后面判断的时候改变顺序就好,只要保证父节点可以进行比较即可。
        if(root == null) return new int[]{1,0,Integer.MAX_VALUE,Integer.MIN_VALUE};
        //后序遍历的原因是要先拿到左右子树的信息才能判断当前节点的信息。
        int[] left = dfs(root.left);
        int[] right = dfs(root.right);
        //递归完左右子树,判断当前node是否是BST
        boolean isBST =  root.val<right[2] && root.val>left[3]  && left[0] ==1 &&right[0] == 1;
        //计算当前BST和
        int currentsum = 0;
        if(isBST){
            currentsum  = root.val + left[1] +right[1];
            maxSum = Math.max(currentsum,maxSum);
        }
        //与空节点判断逻辑相同,是给父节点返回的信息
            //当前node最小值和最大值
            int currentMIN = Math.min(root.val, left[2]);
            int currentMAX = Math.max(root.val, right[3]);
            //currentMIN作为父节点右子树的最小值right[2],同理
            return new int[]{isBST ? 1 : 0,currentsum,currentMIN,currentMAX};
    }
}
posted @ 2025-11-04 09:30  柳成荫y  阅读(9)  评论(0)    收藏  举报