[LeetCode]108.Convert Sorted Array to Binary Search Tree

简介:

【题目】

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

【分析】

二分法,以中间元素i为根节点[start,i-1]递归构建左子树,[i+1,end]递归构建右子树

【代码】

/*********************************
*   日期:2014-12-28
*   作者:SJF0115
*   题目: 108.Convert Sorted Array to Binary Search Tree
*   来源:https://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/
*   结果:AC
*   来源:LeetCode
*   总结:
**********************************/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    TreeNode *sortedArrayToBST(vector<int> &num) {
        if(num.size() == 0){
            return NULL;
        }//if
        return SortedArrayToBST(num,0,num.size()-1);
    }
private:
    TreeNode* SortedArrayToBST(vector<int> &num,int start,int end){
        if(start > end){
            return NULL;
        }//if
        int mid = (start + end) / 2;
        // 根节点
        TreeNode *root = new TreeNode(num[mid]);
        // 左子树
        TreeNode *leftSubTree = SortedArrayToBST(num,start,mid-1);
        // 右子树
        TreeNode *rightSubTree = SortedArrayToBST(num,mid+1,end);
        // 连接
        root->left = leftSubTree;
        root->right = rightSubTree;
        return root;
    }
};
// 层次遍历
vector<vector<int> > LevelOrder(TreeNode *root) {
    vector<int> level;
    vector<vector<int> > levels;
    if(root == NULL){
        return levels;
    }
    queue<TreeNode*> cur,next;
    //入队列
    cur.push(root);
    // 层次遍历
    while(!cur.empty()){
        //当前层遍历
        while(!cur.empty()){
            TreeNode *p = cur.front();
            cur.pop();
            level.push_back(p->val);
            // next保存下一层节点
            //左子树
            if(p->left){
                next.push(p->left);
            }
            //右子树
            if(p->right){
                next.push(p->right);
            }
        }
        levels.push_back(level);
        level.clear();
        swap(next,cur);
    }//while
    return levels;
}

int main() {
    Solution solution;
    vector<int> num = {1,3,5,6,7,13,20};
    TreeNode* root = solution.sortedArrayToBST(num);
    vector<vector<int> > levels = LevelOrder(root);
    for(int i = 0;i < levels.size();i++){
        for(int j = 0;j < levels[i].size();j++){
            cout<<levels[i][j]<<" ";
        }
        cout<<endl;
    }
}


【错解】

class Solution {
public:
    TreeNode *sortedArrayToBST(vector<int> &num) {
        if(num.size() == 0){
            return NULL;
        }//if
        return SortedArrayToBST(num,0,num.size()-1);
    }
private:
    TreeNode* SortedArrayToBST(vector<int> num,int start,int end){
        int len = end - start;
        if(len < 0){
            return NULL;
        }//if
        int mid = (start + end) / 2;
        // 根节点
        TreeNode *root = new TreeNode(num[mid]);
        // 左子树
        TreeNode *leftSubTree = SortedArrayToBST(num,start,mid-1);
        // 右子树
        TreeNode *rightSubTree = SortedArrayToBST(num,mid+1,end);
        // 连接
        root->left = leftSubTree;
        root->right = rightSubTree;
        return root;
    }
};


解析:

注意到这一句代码:TreeNode* SortedArrayToBST(vector<int> num,int start,int end)

传递num是值传递,不是引用传递,所以每次递归调用SortedArrayToBST函数时,它会再次复制这个大vector。所以在递归过程中,这种行为将花费很大内存。



目录
相关文章
|
6月前
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
63 1
|
6月前
Leetcode Minimum Depth of Binary Tree (面试题推荐)
计算树的最小深度 很简单的一道题,只需要遍历一次树,到叶子节点的时候计算一下深度和当前最小深度比较,保存最小值就行。 我在这用了一个全局变量 mindepth。总感觉我这代码写的不够简练,求更精简的方法。
25 0
|
6月前
Leetcode Binary Tree Postorder Traversal(面试题推荐)
非递后续归遍历二叉树,肯定得用到栈。先序遍历很好写,但后续遍历就不是那么容易了。 只需要设置个指针pre,指向最后输出的那个节点就行了,只要判断cur指针指向的是上次输出节点的父节点,且cur无其他未遍历的节点,这个时候就把cur节点输出即可,然后更改pre。原理是要遍历当前节点,其所有子节点都必须遍历完,因为肯定是先左后右,所以只需一个指针保持前一次输出的结果即可。
25 0
|
6月前
Leetcode 236. Lowest Common Ancestor of a Binary Tree
根据LCA的定义,二叉树中最小公共祖先就是两个节点p和q最近的共同祖先节点,LCA的定义没什么好解释的,主要是这道题的解法。
16 0
|
6月前
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
21 0
Search in Rotated Sorted Array - 循环有序数组查找问题
Search in Rotated Sorted Array - 循环有序数组查找问题
51 0
LeetCode 167 Two Sum II - Input array is sorted(输入已排序数组,求其中两个数的和等于给定的数)
给定一个有序数组和一个目标值 找出数组中两个成员,两者之和为目标值,并顺序输出
59 0
LeetCode contest 200 5476. 找出数组游戏的赢家 Find the Winner of an Array Game
LeetCode contest 200 5476. 找出数组游戏的赢家 Find the Winner of an Array Game
LeetCode contest 190 5418. 二叉树中的伪回文路径 Pseudo-Palindromic Paths in a Binary Tree
LeetCode contest 190 5418. 二叉树中的伪回文路径 Pseudo-Palindromic Paths in a Binary Tree
|
算法 Python
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree
LeetCode 108. 将有序数组转换为二叉搜索树 Convert Sorted Array to Binary Search Tree