LeetCode :: Convert Sorted Array (link list) to Binary Search Tree [tree]

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


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


这里两道题目,是连在一起的两题,给你一个排好序(升序)的数组或者链表,将它们转为一棵平衡二叉树。假设不排好序的话,一组随机输入的数据,就必须采用RBT或者AVL树,这样操作会变得更复杂,涉及到旋转,但是这里排好序了。所以,只要找到中位数,作为根,然后递归地根据中位数的左、右数列来构建左右子树;


两题的思路都是如上所述, 唯一的区别就是,链表寻找中位数会麻烦一些,需要引入fast、slow两个指针,来寻找中位数,代码如下:


1.Array

class Solution {
public:
    TreeNode *Tree(int left, int right, vector<int> &num){
        TreeNode *root = NULL;
        if (left <= right){
            int cen = (left + right) / 2;
            root = new TreeNode(num[cen]);
            root->left = Tree(left, cen - 1, num);
            root->right = Tree(cen + 1, right, num);
        }
        return root;
    }
    
    TreeNode *sortedArrayToBST(vector<int> &num) {
        TreeNode *T = NULL;
        int N = num.size();
        T = Tree(0, N - 1, num);
        return T;
    }
};

2.link-list

class Solution {
public:
    ListNode *findMid(ListNode *head){        //这里如果链表中只有两个数字,则mid返回的是head->next.
        if (head == NULL || head -> next == NULL)
            return head;
        ListNode *fast, *slow, *pre;
        fast = slow = head;
        pre = NULL;
        while (fast && fast->next){
            pre = slow;
            slow = slow->next;
            fast = fast->next->next;
        }
        pre->next = NULL;
        return slow;
    }
    
    TreeNode *buildTree(ListNode *head){
        TreeNode *root = NULL;
        ListNode *mid = NULL;
        if (head){
            mid = findMid(head);
            root = new TreeNode(mid->val);
            if (head != mid){
                root->left = buildTree(head);
                root->right = buildTree(mid->next);
            }
        }
        return root;
        
    }
    
    TreeNode *sortedListToBST(ListNode *head) {
        TreeNode *T;
        T = buildTree(head);
        return T;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值