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

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

    本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

    示例:

    给定有序数组: [-10,-3,0,5,9],

    一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

      0
     /
     -3   9
      /     /
    -10 5

    思路:很明显有序数组即二叉树的中序排列,那么这题就变成了如何由一个中序排列复原出一个二叉平衡树。然而,我不会。。。。

    solution:

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     TreeNode* sortedArrayToBST(vector<int>& nums) {
    13       return sortedArrayToBST(nums,0,nums.size()-1);
    14     }
    15 private:
    16   TreeNode* sortedArrayToBST(vector<int>&nums,int start,int end)
    17   {
    18     if(start > end) return nullptr;
    19     int mid = start + (end- start)/2;
    20     TreeNode* root = new TreeNode(nums[mid]);
    21     root->left = sortedArrayToBST(nums,start,mid-1);
    22     root->right = sortedArrayToBST(nums,mid+1,end);
    23     return root;
    24   }
    25 };

    反思:关于二叉搜索树的:

    二叉搜索树是一种用于快速搜索的数据结构,定义为:左孩子上所有节点均小于右孩子上的(使用中序遍历出来的序列一定有序)。对于平衡二叉搜索树,是在二叉搜索树的一种改进,是为了防止我们查找次数过多(节点两边不平衡,一边过少,导致树很高,但节点不多,有很多空指针),所有我们要限制树,使其能更加紧凑,每个节点左右两边节点数目差不多(严格定义是左右相差不能超过1)。

    在有中序的情况下,配合前序或后序都可以复原二叉树。

    (太耻辱了,我这个大学计算机算是白读了,什么东西都没学会,真的现在开始还债了。)

  • 相关阅读:
    ant中build.xml文件解释
    mysql练习题
    Mysql基本知识
    Python Socket 简单聊天室2
    Python Socket 简单聊天室1
    Python 导入模块
    Python 文件的处理
    Python yield
    Python 内置函数
    Python 生成验证码
  • 原文地址:https://www.cnblogs.com/Swetchine/p/11273281.html
Copyright © 2011-2022 走看看