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

    LC109. Convert Sorted List to Binary Search Tree

    将有序链表转化成高度平衡的BST

    总体思路:将中间节点作为二叉树的根节点,递归左子树和右子树

    方法1:将链表值存入数组

    time:$O(n)$

    time:$O(n)$

    class Solution {
    public:
        vector<int> nu;
        TreeNode* build(int b, int e) {
            if (b > e) return nullptr;
            int m = (b + e + 1) / 2;
            auto node = new TreeNode(nu[m]);
            node->left = build(b, m - 1);
            node->right = build(m + 1, e);
            return node;
        }
        TreeNode* sortedListToBST(ListNode* head) {
            auto p = head;
            while (p != NULL) {
                nu.push_back(p->val);
                p = p->next;
            }
            int n = nu.size();
            return build(0, n - 1);
        }
    };

     方法2:不用把链表存入数组,每次用快慢指针找中间元素

    time:$O(nlog n)$

    time:$O(log n)$

    class Solution {
    public:
        TreeNode* build(ListNode* head, ListNode* tail) {
            if (head == tail) {
                return nullptr;
            }
            if (head->next == tail) {
                return new TreeNode(head->val);
            }
            auto mid = head;
            auto tmp = head;
            while (tmp != tail && tmp->next != tail) {
                mid = mid->next;
                tmp = tmp->next->next;
            }
            auto node = new TreeNode(mid->val);
            node->left = build(head, mid);
            node->right = build(mid->next, tail);
            return node;
        }
        TreeNode* sortedListToBST(ListNode* head) {
            return build(head, NULL);
        }
    };

     方法3:模拟中序遍历。知道链表的长度,就可以根据中序遍历建立BST,二叉树中最左边的点就是链表中的第一个点,这样就不用查找链表的中间节点,

    而是按照中序依次建立二叉树中的每个节点,用一个全局变量 ListNode* head 就可以记录下一个要建立的节点

    time:$O(n)$

    time:$O(log n)$

    class Solution {
    public:
        ListNode* head;
        TreeNode* build(int l, int r) {
            if (l > r) {
                return NULL;
            }
            int mid = l + (r - l) / 2;
            TreeNode* left = build(l, mid - 1);
            TreeNode* node = new TreeNode(head->val);
            node->left = left;
            head = head->next;
            node->right = build(mid + 1, r);
            return node;
        }
        TreeNode* sortedListToBST(ListNode* head) {
            int len = 0;
            auto p = head;
            while (p != NULL) {
                len++;
                p = p->next;
            }
            this->head = head;
            return build(0, len - 1);
        }
    };
  • 相关阅读:
    [好文翻译]保卫你的日历
    如何使用PowerShell修改Host文件
    如何使用PowerShell修改注册表
    MSDN文章纠错Automating Microsoft SharePoint 2010 with Windows PowerShell 2.0 (book excerpt)
    如何在PowerShell中得到一个对象的所有属性名和方法名呢?
    Service Object Model
    记录一个问题的解决方法
    STSADM Sync 命令里的 – Ignoreisactive 标志位
    Javascript实现图片位置控制(鼠标拖拽 + 键盘方向键移动)源码分享
    从零开始学习jQuery (六) AJAX快餐【转】
  • 原文地址:https://www.cnblogs.com/betaa/p/12456144.html
Copyright © 2011-2022 走看看