美文网首页
Convert Sorted List to Binary Se

Convert Sorted List to Binary Se

作者: ab409 | 来源:发表于2015-11-18 23:01 被阅读537次

    Convert Sorted List to Binary Search Tree


    今天是一道有关链表和二叉树的题目,来自LeetCode,难度为Medium,Acceptance为26%

    题目如下

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

    Example

    解题思路及代码见阅读原文

    回复0000查看更多题目

    解题思路

    首先,该题还是有难度的,但是我们换一个思路可能就会简单很多,即如果是将一个排序二叉树转换成链表,相信大多数同学都会做,无非是一个中序遍历。

    那么,这里讲链表转换成二叉树也是一样的思路,即一个中序遍历,其具体思路如下。

    按照中序遍历的思路,应该先生成左子树,然后是根节点,最后的右子树。那么,很明显这是一个递归的结构。那么剩下的问题就是如何确定递归的终止条件。

    因为在转换的过程中,需要计算各子链表的长度,那么这里就可以由此来终止递归,即当长度等于0时终止。下面我们来看代码。

    代码如下

    C++版
    class Solution {
    public:
        ListNode *list;
        int count(ListNode *node){
            int size = 0;
            while (node) {
                ++size;
                node = node->next;
            }
            return size;
        }
    
        TreeNode *generate(int n){
            if (n == 0)
                return NULL;
            TreeNode *node = new TreeNode(0);
            node->left = generate(n / 2);
            node->val = list->val;
            list = list->next;
            node->right = generate(n - n / 2 - 1);
            return node;
        }
    
        TreeNode *sortedListToBST(ListNode *head) {
            this->list = head;
            return generate(count(head));
        }
    };
    
    java版
    private ListNode node;
    
    public TreeNode sortedListToBST(ListNode head) {
        if(head == null){
            return null;
        }
    
        int size = 0;
        ListNode runner = head;
        node = head;
    
        while(runner != null){
            runner = runner.next;
            size ++;
        }
    
        return inorderHelper(0, size - 1);
    }
    
    public TreeNode inorderHelper(int start, int end){
        if(start > end){
            return null;
        }
    
        int mid = start + (end - start) / 2;
        TreeNode left = inorderHelper(start, mid - 1);
    
        TreeNode treenode = new TreeNode(node.val);
        treenode.left = left;
        node = node.next;
    
        TreeNode right = inorderHelper(mid + 1, end);
        treenode.right = right;
    
        return treenode;
    }
    

    相关文章

      网友评论

          本文标题:Convert Sorted List to Binary Se

          本文链接:https://www.haomeiwen.com/subject/dcrlhttx.html