代码随想录第23天|669. 修剪二叉搜索树 ,108.将有序数组转换成(平衡)二叉搜索树 , 538.把二叉搜索树转换为累加树

 669. 修剪二叉搜索树 

思路

1.确定终止条件

修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。

2.确定单层递归的逻辑:

如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。

如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。

3.接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。

最后返回root节点

代码实现

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root==null){return root;}//终止条件
        //递归逻辑
        //如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
        if(root.val>high){
            return  trimBST(root.left,low,high);

        }
        if(root.val

108.将有序数组转换成(平衡)二叉搜索树 

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

思路,递归前序,首先找出有序数组nums的中间节点,记索引为mid,在数组的mid索引左边部分为BST的左子树,右边部分为右子树

注意终止条件,当left>right时结束dfs

代码实现

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {//nums已经是升序的
         return dfs(nums,0,nums.length-1);//调用dfs的时候传入的left和right为什么是0和nums.length-1,因为定义的区间为左闭右闭。

    }
    public TreeNode dfs(int[] nums,int left,int right){
         if (left > right) return null;//终止条件

        //找到中间点
        int mid=(left+right)>>1;
        TreeNode root=new TreeNode(nums[mid]);
        root.left=dfs(nums,left,mid-1);//构建左子树
        root.right=dfs(nums,mid+1,right);//构建右子树
        return root;

    }
}

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

第一眼思路是 从最底层最右边开始向上回溯,但是代码写不出。

题解:

终止条件,当root==null直接返回root

反中序遍历右中左,在中间节点处理累加逻辑

代码实现

class Solution {
    int pre = 0; // 记录前一个节点的数值
    public TreeNode convertBST(TreeNode root) {
        //树中的所有值 互不相同 。 //BST是有序的 //给定的树为二叉搜索树。
       
       
        //1.终止条件
        if(root==null){return root;}
        //从最底层最右边节点开始回溯,右中左,反中序遍历
        //2.单层递归逻辑
        //右
        convertBST(root.right);
        //中间节点处理逻辑
        root.val+=pre;
        pre=root.val;
       
        //左
        convertBST(root.left);
       
        return root;

    }
}

到这里二叉树都1刷,下一篇总结一下

你可能感兴趣的:(算法训练营,算法,leetcode,职场和发展)