代码随想录算法训练营第二十天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

LeetCode 654.最大二叉树

题目链接🔗:654.最大二叉树

解题思路🤔

递归法

  1. 确定递归函数的参数和返回值
    • 参数:存放元素的数组
    • 返回值:该数组构造的二叉树的头节点
  2. 确定终止条件
    • 当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点
    • 定义一个新节点,把这个数组的数值赋给新节点并返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
  3. 确定单层递归的逻辑
    • 找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组
    • 最大值所在的下标左区间 构造左子树:maxValueIndex > 0,保证左区间至少有一个数值
    • 最大值所在的下标右区间 构造右子树:maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值

遇到的问题😢

代码实现👨🏻‍💻

递归法

var constructMaximumBinaryTree = function (nums) {
    const BuildTree = (arr, left, right) => {
        if (left > right) return null;
        let maxValue = -1;
        let maxIndex = -1;
        
        for (let i = left; i <= right; ++i) {
            if (arr[i] > maxValue) {
                maxValue = arr[i];
                maxIndex = i;
            }
        }
        
        let root = new TreeNode(maxValue);
        root.left = BuildTree(arr, left, maxIndex - 1);
        root.right = BuildTree(arr, maxIndex + 1, right);
        
        return root;
    }
    
    let root = BuildTree(nums, 0, nums.length - 1);
    return root;
};

总结📖


LeetCode 617.合并二叉树

题目链接🔗:617.合并二叉树

解题思路🤔

遍历两个树与遍历一个树逻辑是一样的,只不过传入的是两个树的节点,同时操作。

递归法:

  1. 确定递归函数的参数和返回值

    • 参数:两个二叉树的根节点
    • 返回值:合并之后二叉树的根节点
  2. 确定终止条件

    存在两个树遍历的节点t1 和 t2,如果t1 == null,两个树合并后结果是 t2 ;反之为t1(如果t1 / t2也为NULL也无所谓,合并之后就是NULL)。

  3. 确定单层递归的逻辑

    假设t1是合并之后树的根节点。在单层递归中,就要把两棵树的元素加到一起:

    t1->val += t2->val;

    接下来 t1 的左子树是:合并 t1左子树、t2左子树之后的左子树。

    t1 的右子树是: 合并 t1右子树、t2右子树之后的右子树。

    最终t1就是合并之后的根节点。

遇到的问题😢

代码实现👨🏻‍💻

递归法

var mergeTrees = function (root1, root2) {
    const preOrder = (root1, root2) => {
        if (!root1) return root2
        if (!root2) return root1;
        
        root1.val += root2.val;
        root1.left = preOrder(root1.left, root2.left);
        root1.right = preOrder(root1.right, root2.right);
        
        return root1;
    }
    
    return preOrder(root1, root2);
};

总结📖


LeetCode 700.二叉搜索树中的搜索

题目链接🔗:700.二叉搜索树中的搜索

解题思路🤔

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

递归法

  1. 确定递归函数的参数和返回值

    • 参数:根节点和要搜索的数值
    • 返回值:要搜索的数值所在的节点
  2. 确定终止条件

    root为空或找到这个数值,返回root节点

  3. 确定单层递归的逻辑

    • 如果root->val > val,搜索左子树
    • 如果root->val < val,就搜索右子树
    • 如果都没有搜索到,就返回null

遇到的问题😢

代码实现👨🏻‍💻

递归法

var searchBST = function (root, val) {
    if (!root || root.val === val) return root;
    
    if (root.val > val) return searchBST(root.left, val);
    
    if (root.val < val) return searchBST(root.right, val);
};

总结📖


LeetCode 98.验证二叉搜索树

题目链接🔗:98.验证二叉搜索树

解题思路🤔

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树

在中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

整体思路:

  1. 递归中序遍历将二叉搜索树转变成一个数组
  2. 比较一下这个数组是否是有序的,注意二叉搜索树中不能有重复元素

递归法:

  1. 确定递归函数的参数和返回值

    • 参数:longlong的全局变量(用来比较遍历的节点是否有序)
    • 返回值:bool类型的值
  2. 确定终止条件

    空节点,二叉搜索树可以为空

  3. 确定单层递归的逻辑
    中序遍历,一直更新maxVal,一旦发现maxVal >= root->val,就返回false,注意元素相同时候也要返回false

遇到的问题😢

代码实现👨🏻‍💻

递归法

var isValidBST = function (root) {
    let arr = [];
    const buildArr = (root) => {
        if (root) {
            buildArr(root.left);
            arr.push(root.val);
            buildArr(root.right);
        }
    }
    
    buildArr(root);
    
    for (let i = 1; i < arr.length; ++i) {
        if (arr[i] <= arr[i - 1]) return false;
    }
    
    return true;
};

总结📖


今日收获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值