代码随想录算法训练营第二十三天|LeetCode669,108,538

代码随想录算法训练营第二十三天|LeetCode669,108,538

669. 修剪二叉搜索树

通过本题可以了解到:涉及二叉树节点的插入,删除。递归函数的返回值均可以为TreeNode,方便节点的操作
确定递归函数的参数以及返回值
通过递归函数的返回值来移除节点。
确定终止条件
修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
确定单层递归的逻辑
如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

 public TreeNode trimBST(TreeNode root, int low, int high) {
        if (root == null){
            return root;
        }
        if (root.val>high){
            //这里就删除了不符合条件的节点。
            return trimBST(root.left,low,high);
        }
        if (root.val<low){
            return trimBST(root.right,low,high);
        }
        if (root.val <= high&&root.val>=low){
            root.left = trimBST(root.left,low,high);
            root.right = trimBST(root.right,low,high);
        }
        return root;
    }

108.将有序数组转换为二叉搜索树

递归三部曲:

1.确定返回值以及参数

构造一颗二叉树可以认为是不断向二叉树中添加节点,所以可以利用返回值来添加节点

2.确定递归返回条件

设计区间的循环不变量,本题采用 前闭后开 的定义方式。所以判断条件为right>left

3.确定循环逻辑:

取了中间位置,就开始以中间位置的元素构造节点,代码:TreeNode* root = new TreeNode(nums[mid]);

接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。

public TreeNode sortedArrayToBST(int[] nums) {
        return findNode(nums,0, nums.length);

    }
    public TreeNode findNode(int[] nums, int start, int end){
        if (start >= end){
            return null;
        }

        //获取当前数组的中间节点,注意越界问题
        int mid = start + (end - start) / 2;

        TreeNode node = new TreeNode(nums[mid]);

        node.left = findNode(nums, start, mid);
        node.right = findNode(nums, mid+1, end);

        return node;
    }

538.把二叉搜索树转换为累加树

从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。

    Integer pre = 0;

    public void traversal(TreeNode node){
        if (node == null){
            return;
        }
        traversal(node.right);
        node.val = node.val + pre;
        pre = node.val;
        traversal(node.left);
    }
    public TreeNode convertBST(TreeNode root) {
        traversal(root);
        return root;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值