• 0108有序数组转为二叉搜索树 Marathon


    给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

    高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

    示例 1:

    输入:nums = [-10,-3,0,5,9]
    输出:[0,-3,9,-10,null,5]
    解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

    示例 2:

    输入:nums = [1,3]
    输出:[3,1]
    解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。

    提示:

    1 <= nums.length <= 104
    -104 <= nums[i] <= 104
    nums 按 严格递增 顺序排列

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree

    参考:

    python

    # 0108.将有序数组构造为二叉搜索树
    
    class Solution1:
        def sortedArrayToBST(self, nums: [int]) -> TreeNode:
            """
            递归-左闭右开
            :param nums:
            :return:
            """
            def sortedToBST(nums: [int], left: int, right: int) -> TreeNode:
                if left >= right:
                    return None
                if right - left == 1:
                    return TreeNode(nums[left])
    
                # 若为偶数,取的为中间两值的左值
                mid = left + int((right-left)/2)
    
                root = TreeNode(nums[mid])
                # [left, mid)
                root.left = sortedToBST(nums, left, mid)
                # [mid+1, right)
                root.right = sortedToBST(nums, mid+1, right)
                return root
    
            return sortedToBST(nums, 0, len(nums))
    
    class Solution2:
        def sortedArrayToBST(self, nums: [int]) -> TreeNode:
            """
            递归-左闭右闭
            :param nums:
            :return:
            """
            def sortedToBST(nums: [int], left: int, right: int) -> TreeNode:
                if left > right:
                    return None
    
                mid = left + int((right-left)/2)
                root = TreeNode(nums[mid])
                root.left = sortedToBST(nums, left, mid-1)
                root.right = sortedToBST(nums, mid+1, right)
                return root
    
            return sortedToBST(nums, 0, len(nums)-1)
    
    class Solution3:
        def sortedArrayToBST(self, nums: [int]) -> TreeNode:
            """
            迭代-左闭右闭-LC超时
            :param nums:
            :return:
            """
            if len(nums) == 0:
                return None
    
            # root initial
            root = TreeNode(-1)
            # 维护三个队列,节点队列,左部节点下标队列,右部节点下标队列
            nodeQueue = []
            leftQueue = []
            rightQueue = []
    
            # 根节点入队
            nodeQueue.append(root)
            # 下标队列入队
            leftQueue.append(0)
            rightQueue.append(len(nums)-1)
    
            while nodeQueue:
                curNode = nodeQueue.pop(0)
                left = leftQueue.pop(0)
                right = rightQueue.pop(0)
                mid = left + int((right-left)>>1)
    
                # 中间节点
                curNode.val = nums[mid]
    
                # 左区间构造二叉树
                if left <= mid -1:
                    curNode.left = TreeNode(-1)
                    nodeQueue.append(curNode.left)
                    leftQueue.append(left)
                    rightQueue.append(mid-1)
                # 右区间构造二叉树
                if right >= mid -1:
                    curNode.right = TreeNode(-1)
                    nodeQueue.append(curNode.right)
                    leftQueue.append(mid+1)
                    rightQueue.append(right)
    
            return root
    
    
    
    

    golang

    package binaryTree
    
    import "container/list"
    
    func sortedArrayToBST(nums []int) *TreeNode {
    	// 递归-左闭右开
    	if len(nums)==0{return nil}//终止条件,最后数组为空则可以返回
    	root:=&TreeNode{nums[len(nums)/2],nil,nil}//按照BSL的特点,从中间构造节点
    	root.Left=sortedArrayToBST(nums[:len(nums)/2])//数组的左边为左子树
    	root.Right=sortedArrayToBST(nums[len(nums)/2+1:])//数字的右边为右子树
    	return root
    }
    
    func sortedArrayToBST2(nums []int) *TreeNode {
    	// 递归-左闭右闭
    	var sortedToBST func(nums []int, left int, right int) *TreeNode
    	sortedToBST = func(nums []int, left int, right int) *TreeNode {
    		if left > right {
    			return nil
    		}
    		var mid int = left + (right-left) >> 1
    		root := &TreeNode{Val: nums[mid]}
    		root.Left = sortedToBST(nums, left, mid-1)
    		root.Right = sortedToBST(nums, mid+1, right)
    		return root
    	}
    	return sortedToBST(nums, 0, len(nums)-1)
    }
    
    func sortedArrayToBST3(nums []int) *TreeNode {
    	// 迭代-左闭右闭-LC超时
    	if len(nums) == 0 {
    		return nil
    	}
    	// 根节点初始化
    	root := &TreeNode{Val: -1}
    	// 维护三个队列,节点队列,左区间下标队列,右区间下标队列
    	nodeQueue := list.New()
    	leftQueue := []int{}
    	rightQueue := []int{}
    
    	// 节点&下标入队
    	nodeQueue.PushBack(root)
    	leftQueue = append(leftQueue,0)
    	rightQueue = append(rightQueue,len(nums)-1)
    
    	// 构造二叉搜索树
    	for nodeQueue.Len() > 0 {
    		// 出队
    		curNode := nodeQueue.Remove(nodeQueue.Front()).(*TreeNode)
    		left := leftQueue[0]
    		if len(leftQueue) == 1{
    			leftQueue = []int{}
    		} else {
    			leftQueue = leftQueue[1:]
    		}
    		right := rightQueue[0]
    		if len(rightQueue) == 1{
    			rightQueue = []int{}
    		} else {
    			rightQueue = rightQueue[1:]
    		}
    		var mid int = left + (right-left) >> 1
    		// 中间节点
    		curNode.Val = nums[mid]
    		// 左右区间构造二叉树
    		if left <= mid -1 {
    			curNode.Left = &TreeNode{Val: -1}
    			nodeQueue.PushBack(curNode.Left)
    			leftQueue = append(leftQueue, left)
    			rightQueue = append(rightQueue, mid-1)
    		}
    		if right >= mid -1 {
    			curNode.Right = &TreeNode{Val: -1}
    			nodeQueue.PushBack(curNode.Right)
    			leftQueue = append(leftQueue, mid+1)
    			rightQueue = append(rightQueue, right)
    		}
    
    
    	}
    	return root
    }
    
    
    
  • 相关阅读:
    [PHP] Layui + jquery 实现 实用的文章自定义标签
    个人总结第五周
    个人总结第四周
    个人总结第三周
    个人总结第二周
    个人总结第一周
    用户体验评价
    第二阶段scrum冲刺
    单词统计
    用户模块和用户场景
  • 原文地址:https://www.cnblogs.com/davis12/p/15580243.html
Copyright © 2020-2023  润新知