二叉搜索树的搜索/插入/删除/转换

验证是否是
此处要注意⚠️左子树和右子树中都不存在和节点相同的值,故为>=和<=

var isValidBST = function(root) {
    function dfs(root,min,max){
        if(!root) return true
        if(root.val<=min||root.val>=max){
            return false
        }
        return dfs(root.left,min,root.val)&&dfs(root.right,root.val,max)
    }
    return dfs(root,-Infinity,Infinity)
};

搜索节点

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

插入
一直向下探索,直到找到一个合适的空位可以插入新节点

var insertIntoBST = function(root, val) {
    if(!root){
       root=new TreeNode(val)
       return root
    }
    if(root.val>val){
        root.left=insertIntoBST(root.left,val)
    }else{
        root.right=insertIntoBST(root.right,val)
    }
    return root
};

删除

var deleteNode = function(root, key) {
    if(!root) return root
    if(root.val>key){
        root.left = deleteNode(root.left,key)
    }else if(root.val<key){
        root.right = deleteNode(root.right,key)
    }else{
        if(!root.left&&!root.right){
            root=null
        }else if(root.left){
            let maxVal=findMax(root.left)
            root.val=maxVal.val
            root.left=deleteNode(root.left,maxVal.val)
        }else{
            let minVal=findMin(root.right)
            root.val=minVal.val
            root.right=deleteNode(root.right,minVal.val)
        }
    }
    return root
};
function findMax(root){
    while(root.right){
        root=root.right
    }
    return root
}
function findMin(root){
    while(root.left){
        root=root.left
    }
    return root
}

有序数组转换为二叉搜索树
这题要注意⚠️的是:当在buildTree中递归时,在low>high要及时中止递归

var sortedArrayToBST = function(nums) {
    if(nums.length===0) return null
    const root=buildTree(0,nums.length-1)
    function buildTree(low,high){
        if(low>high){
            return null
        }
        const mid=Math.floor(low+(high-low)/2)
        const curr=new TreeNode(nums[mid])
        curr.left=buildTree(low,mid-1)
        curr.right=buildTree(mid+1,high)
        return curr
    }
    return root
};

判断是否是二叉搜索树的后序遍历
这里的递归终止位置是数组不存在/数组长度为0

var verifyPostorder = function(postorder) {
    function verify(order){
        if(order&&order.length>0){
            const root=order[order.length-1]
            for(var i=0;i<order.length-1;i++){
                if(order[i]>root){
                    break
                }
            }
            for(let j=i;j<order.length-1;j++){
                if(order[j]<root){
                    return false
                }
            }
            return verify(order.slice(0,i))&&verify(order.slice(i,order.length-1))   
        }else{
            return true
        }
    }
    return verify(postorder)
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值