LeetCode刷题日记之二叉搜索树中插入值

84 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
1.二叉搜索树的最近公共祖先

题目描述

image.png

解题思路

递归法:
1.确认递归参数及返回值,参数为根节点及p、q节点,返回值为所求节点
2.确认递归终止条件,当节点为空时返回根节点
3.确认单层递归逻辑

 if(root.val>p.val&&root.val>q.val) {  // 二叉搜索树是有序的,所以只需要遍历单边即可
        // 向左子树查询
        let left = lowestCommonAncestor(root.left,p,q);
        return left !== null&&left;
    }
    if(root.val<p.val&&root.val<q.val) {
        // 向右子树查询
        let right = lowestCommonAncestor(root.right,p,q);
        return right !== null&&right;
    }

整体代码

var lowestCommonAncestor = function(root, p, q) {
    // 使用递归的方法
    // 1. 使用给定的递归函数lowestCommonAncestor
    // 2. 确定递归终止条件
    if(root === null) {
        return root;
    }
    if(root.val>p.val&&root.val>q.val) {
        // 向左子树查询
        let left = lowestCommonAncestor(root.left,p,q);
        return left !== null&&left;
    }
    if(root.val<p.val&&root.val<q.val) {
        // 向右子树查询
        let right = lowestCommonAncestor(root.right,p,q);
        return right !== null&&right;
    }
    return root;
};

迭代法,本题同样可以使用迭代方式解决,当遍历节点同时小于或者大于p、q节点时,只需选择一边即可,当遍历节点位于pq之间时,就是我们需要找的节点。

var lowestCommonAncestor = function(root, p, q) {
    while(root) {
        if(root.val > p.val && root.val > q.val) { // 二叉搜索树 节点值大于p q 说明在左子树中
            root = root.left
        } else if(root.val < p.val && root.val < q.val) {
            root = root.right
        } else {
            return root
        }
    }

    return null
};

2.二叉搜索树中的插入操作

题目描述

image.png

解题思路

二叉搜索树中序遍历是一个有序数组,本题只需要使用中序遍历,找到空节点,再将该节点插入即可。

var insertIntoBST = function(root, val) {
   if(root == null) {
       // 遍历到空节点就插入节点
       const node = new TreeNode(val)
       return node
   }

   if(root.val > val) { // 节点值大于插入值 说明应该在左边插入
       root.left = insertIntoBST(root.left,val)
   }
   if(root.val < val) {
       root.right = insertIntoBST(root.right,val)
   }
   return root 
};

迭代法

var insertIntoBST = function(root, val) {
    // 迭代

    if(root=== null){
        const node = new TreeNode(val)
        return node // 空树 直接返回
    }

    let cur = root 
    let parent = root
    while(cur!==null){
        parent = cur
        if(cur.val > val) {
            cur = cur.left
        } else {
            cur = cur.right
        }
    }

    const node = new TreeNode(val)
    if(parent.val > val) parent.left = node
    else parent.right = node

    return root
};