zoukankan      html  css  js  c++  java
  • LeetCode Convert Sorted List to Binary Search Tree

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode *sortedListToBST(ListNode *head) {
            ListNode *cur = head;
            int len = 0;
            while (cur != NULL) {
                len++;
                cur = cur->next;
            }
            return dfs(head, len);
        }
        
        TreeNode* dfs(ListNode *head, int len) {
            if (head == NULL || len <= 0) return NULL;
            int mid = len / 2;
            ListNode* cur = head;
            
            while (mid > 0) {
                cur = cur->next;
                mid--;
            }
            
            TreeNode* nroot = new TreeNode(cur->val);
            nroot->left = dfs(head, len / 2);
            nroot->right= dfs(cur->next, (len - 1) / 2);
            return nroot;
        }
    };

    要改进

    第二轮:

    Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

    使用build函数产生一个树形调用结构(中序遍历),使用了一个类成员变量,表示当前使用的节点,因为我们知道中序遍历所获得的节点顺序就是所有节点排序后的顺序即sorted list中的序列。这样一来可以省去通过循环遍历获取当前片段中点元素。复杂度从O(nlogn)降低到O(n)

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
     // 8:37
    class Solution {
    private:
        ListNode* cur;
    public:
        TreeNode *sortedListToBST(ListNode *head) {
            int cnt = 0;
            cur = head;
            while(head != NULL) {
                cnt++;
                head = head->next;
            }
            return build(0, cnt);
        }
        TreeNode* build(int start, int end) {
            if (start >= end) {
                return NULL;
            }
            int mid = (start + end) / 2;
            TreeNode* leftChild = build(start, mid);
            TreeNode* parent = new TreeNode(cur->val);
            parent->left = leftChild;
            cur = cur->next;
            TreeNode* rightChild = build(mid+1, end);
            parent->right = rightChild;
            return parent;
        }
    };
  • 相关阅读:
    什么才是java的基础知识?
    Java的背景、影响及前景
    设计模式分类
    关于日期及日期格式转换的记录
    添加同名工具后台验证后不跳转且保留用户输入的数值
    案件讨论回复中出现把多个附件当成一个评论显示,导致分页出错
    指令发布详情弹窗实现“取消”按钮
    最大间隔分离超平面的唯一性完整证明
    CART算法与剪枝原理
    Spark MLlib学习
  • 原文地址:https://www.cnblogs.com/lailailai/p/3844220.html
Copyright © 2011-2022 走看看