[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。所以在递归过程中,这种行为将花费很大内存。



目录
相关文章
|
Java
Leetcode 114. Flatten Binary Tree to Linked List
思路也很简单,先把root的左子树(如有)变成单链表 leftlinkedlist,把root的右子树(如有)变成单链表 rightlinkedlist,再把root的右节点变成leftlikedlist,再把rightlinkedlist接到leftlinkedlist后面,代码如下。
54 1
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
96 1
Leetcode Minimum Depth of Binary Tree (面试题推荐)
计算树的最小深度 很简单的一道题,只需要遍历一次树,到叶子节点的时候计算一下深度和当前最小深度比较,保存最小值就行。 我在这用了一个全局变量 mindepth。总感觉我这代码写的不够简练,求更精简的方法。
55 0
Leetcode Binary Tree Postorder Traversal(面试题推荐)
非递后续归遍历二叉树,肯定得用到栈。先序遍历很好写,但后续遍历就不是那么容易了。 只需要设置个指针pre,指向最后输出的那个节点就行了,只要判断cur指针指向的是上次输出节点的父节点,且cur无其他未遍历的节点,这个时候就把cur节点输出即可,然后更改pre。原理是要遍历当前节点,其所有子节点都必须遍历完,因为肯定是先左后右,所以只需一个指针保持前一次输出的结果即可。
58 0
Leetcode 236. Lowest Common Ancestor of a Binary Tree
根据LCA的定义,二叉树中最小公共祖先就是两个节点p和q最近的共同祖先节点,LCA的定义没什么好解释的,主要是这道题的解法。
47 0
Leetcode 4. Median of Two Sorted Arrays
题目描述很简单,就是找到两个有序数组合并后的中位数,要求时间复杂度O(log (m+n))。 如果不要去时间复杂度,很容易就想到了归并排序,归并排序的时间复杂度是O(m+n),空间复杂度也是O(m+n),不满足题目要求,其实我开始也不知道怎么做,后来看了别人的博客才知道有个二分法求两个有序数组中第k大数的方法。
45 0
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
55 0
Leetcode Find Minimum in Rotated Sorted Array 题解
对一个有序数组翻转, 就是随机取前K个数,移动到数组的后面,然后让你找出最小的那个数,注意,K有可能是0,也就是没有翻转。
60 0
Search in Rotated Sorted Array - 循环有序数组查找问题
Search in Rotated Sorted Array - 循环有序数组查找问题
81 0
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
114 67