zoukankan      html  css  js  c++  java
  • 将有序数组转换为二叉搜索树

    题解思路:

    二叉搜索树(Binary Search Tree)是指一棵空树或具有如下性质的二叉树:

    • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
    • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值
    • 任意节点的左、右子树也分别为二叉搜索树
    • 没有键值相等的节点

    基于以上性质,我们可以得出一个二叉搜索树的特性:二叉搜索树的中序遍历结果为递增序列。

    那么现在题目给了我们一个递增序列,要求我们构造一棵二叉搜索树,就是要我们实现这一特性的逆过程。

    递归设计

    函数作用:通过上述解题过程我们可以明确该问题的子问题是:构造树的每个节点以及该节点的左右子树。因此,递归函数的作用很明显:

    1. 选取要构造关系的节点并创建它
    2. 构造该节点的左子树
    3. 构造该节点的右子树
    4. 函数的输入为递增数组,函数的返回为完成构造的节点。

    何时结束

    当输入的递增数组为空时,只能构成一棵空树,此时返回空节点。

    何时调用

    当构造节点的左右子树时,对递增数组进行拆分并进行递归调用。

    实现

    Java

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
      int[] nums;
    
      public TreeNode helper(int left, int right) {
        if (left > right) return null;
    
        // always choose left middle node as a root
        int p = (left + right) / 2;
    
       
        TreeNode root = new TreeNode(nums[p]);
        root.left = helper(left, p - 1);
        root.right = helper(p + 1, right);
        return root;
      }
    
      public TreeNode sortedArrayToBST(int[] nums) {
        this.nums = nums;
        return helper(0, nums.length - 1);
      }
    }
    

    python:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
            if not nums:
                return None
            
            # 找到中点作为根节点
            mid = len(nums) // 2
            node = TreeNode(nums[mid])
    
            # 左侧数组作为左子树
            left = nums[:mid]
            right = nums[mid+1:]
    
            # 递归调用
            node.left = self.sortedArrayToBST(left)
            node.right = self.sortedArrayToBST(right)
    
            return node
    

    链接:https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/

  • 相关阅读:
    HDU 2899 Strange fuction
    HDU 2899 Strange fuction
    HDU 2199 Can you solve this equation?
    HDU 2199 Can you solve this equation?
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
    Java实现 LeetCode 699 掉落的方块(线段树?)
  • 原文地址:https://www.cnblogs.com/treasury/p/12659505.html
Copyright © 2011-2022 走看看