LeetCoode—**Convert Sorted List to Binary Search Tree 将单链表表示为平衡二叉

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

我想如果只是表示成二叉树,没有什么难度,但是如果是表示为平衡二叉树那么可能就有难度了

要求左右子树的高度是均衡的

先给出自己的解法,很low,就是现将节点都保存在vector里面,在选用mid进行递归创建

时间,空间复杂度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) {}
 * };
 */
class Solution {
public:
    TreeNode *sortedListToBST(ListNode *head) {
        //<这里一开始想的时候就是觉得链表处理很不方便,希望能够先放到vector当中
        vector<TreeNode*> NodeList;
        if(head == NULL)
        {
            return NULL;
        }
        TreeNode * phead = new TreeNode(head->val);
        NodeList.push_back(phead);
        while(head->next != NULL)
        {
            head = head->next;
            TreeNode * node = new TreeNode(head->val);
            NodeList.push_back(node);

        }
        return BST(0,NodeList.size()-1,NodeList);//<表示初始值,和结束的值
    }
    TreeNode *BST(int start,int end,vector<TreeNode*> NodeList)
    {
        if(start == end)
        {
            return NodeList[start];
        }
        if((start+1) == end)//<按数值增大的方向排序,那么直接放在右孩子的位置
        {
            NodeList[start]->right = NodeList[end];
            return NodeList[start];
        }
        int Mid = (start+end)/2;
        TreeNode *root = NodeList[Mid];
        root->left = BST(start,Mid-1,NodeList);
        root->right = BST(Mid+1,end,NodeList);
        return root;
    }
};

下面是标准答案,时间复杂度就是O(N),空间复杂度为O(1)

但是在整个子树的递归过程中本人表示还是很绕啊

TreeNode *sortedListToBST(ListNode *head)
{
    int len = 0;
       ListNode * node = head;
       while (node != NULL)
       {
           node = node->next;
           len++;
       }
       return buildTree(head, 0, len-1);
   }  

   TreeNode *buildTree(ListNode *&node, int start, int end)
   {
       if (start > end) return NULL;
       int mid = start + (end - start)/2;
       TreeNode *left = buildTree(node, start, mid-1);
       TreeNode *root = new TreeNode(node->val);    //<返回的时候表明上一层中start == mid,所以这个点为mid点
       root->left = left;
       node = node->next;
       root->right = buildTree(node, mid+1, end);
       return root;
   }  
时间: 2024-11-05 13:35:25

LeetCoode—**Convert Sorted List to Binary Search Tree 将单链表表示为平衡二叉的相关文章

[LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树思路完全一样,只不过是操作的数据类型有所差别,一个是数组,一个是链表.数组方便就方便在可以通过index直接访问任意一个元

LeeCode 109.Convert Sorted List to Binary Search Tree(将排序链表转化为BST) 解题思路和方法

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 思路:此题与排序数组很大的不同是链表不知道长度以及上面的值.其整体思路还是中间值作为根节点,但是需要一点策略,不然就会超时. 先整体遍历长度之后,将长度保存,这样就不需要每次都遍历链表了. 代码如下: /** * Definition for singly-linked list

109. Convert Sorted List to Binary Search Tree 将一个有序链表转化成BST

看问题,首先想到的解决办法如下: (1)单独设计一个函数可以,计算出有序链表的中间节点的前驱节点.后续会看到原因,这个函数进入的有序链表长度长度至少有2个节点: (2)回到原来需要设计的函数: a. 如果没有节点返回null,如果是只有一个节点,将这个节点制造成树节点返回:由于这个原因,输入到寻找前驱节点的问题的有序链表至少2个节点: b. 找到前驱节点,找到中间节点,完成赋值. c. 在前驱节点和中间节点之间进行切段:为了实现分治递归的用途: d. 递归寻找左节点,右节点:返回根节点: 其中:

leetcode 109 Convert Sorted List to Binary Search Tree

题目连接 https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ Convert Sorted List to Binary Search Tree Description Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. /** * De

leetcode 108 Convert Sorted Array to Binary Search Tree

题目连接 https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ Convert Sorted Array to Binary Search Tree Description Given an array where elements are sorted in ascending order, convert it to a height balanced BST. /** * Definition f

39.1: Convert Sorted Array to Binary Search Tree

/************************************************************************/            /*       39.1:  Convert Sorted Array to Binary Search Tree                               */            /************************************************************

Convert Sorted Array to Binary Search Tree &amp; Convert Sorted List to Binary Search Tree

Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 方法:将有序数组转为平衡二叉树,我们知道平衡二叉树的中序遍历是有序数组,而且“中间”的元素可以作为根节点,那么构建树的时候,找出中间元素,构造根元素,然后继续重复上面的方法,构造左子树和右子树.代码如下: 1 /**

leetcode dfs Convert Sorted List to Binary Search Tree

Convert Sorted List to Binary Search Tree Total Accepted: 21420 Total Submissions: 78476My Submissions Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题意:把有序单链表转换为二叉查找树 思路: 用链表中心作为当作二叉树的根,

[leetcode]Convert Sorted List to Binary Search Tree @ Python

原题地址:http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题意:将一条排序好的链表转换为二叉查找树,二叉查找树需要平衡. 解题思路:两个思路:一,可以使用快慢指针来找到中间的那个节点,然后将这个节点作为树根,并分别递归这个节点左右两边的链表产生左右子树,这样的好处是不需要使用额外的空间,坏处是代码不够整洁.二,将排序好的链表的每个节点的值存入一个数组中,这样就和http://www.cnblog