[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.

题目要求:转成高度平衡的二叉搜索树。

高度平衡的二叉搜索树:i)左子树和右子树的高度之差的绝对值不超过1; ii)树中的每个左子树和右子树都是AVL树; iii)每个节点都有一个平衡因子(balance factor bf),任一节点的平衡因子是1,0,-1.(每个节点的平衡因子等于右子树的高度减去左子树的高度)  .

方法一:使用快慢指针

思路:若是一升序的数组,则取中间元素,作为根节点,然后以此方法分别去构成处左右子树。但链表没有办法直接访问其中间的结点,怎么办?可以通过快慢指针的方式,当快指针到链表结尾时,慢指针刚好到链表的中间来实现找到中间结点的目的。然后用递归的方法构造树。代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 /**
10  * Definition for binary tree
11  * struct TreeNode {
12  *     int val;
13  *     TreeNode *left;
14  *     TreeNode *right;
15  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
16  * };
17  */
18 class Solution {
19 public:
20     TreeNode *sortedListToBST(ListNode *head)
21     {
22         if(head==NULL)  return NULL;
23         if(head->next==NULL)    return new TreeNode(head->val);
24
25         ListNode *fast=head;
26         ListNode *slow=head;
27         ListNode *preSlow=NULL;
28
29         while(fast&&fast->next)
30         {
31             preSlow=slow;
32             slow=slow->next;
33             fast=fast->next->next;
34         }
35
36         TreeNode *root=new TreeNode(slow->val);
37         preSlow->next=NULL;
38         root->left=sortedListToBST(head);
39         root->right=sortedListToBST(slow->next);
40
41         return root;
42
43     }
44 };

代码中值得注意的:一、只有一个结点时返回值的写法;二、使用快慢指针时,前半段要比后半段多;三、链表分成两条时,注意在结尾压入NULL,形成两条。

方法二:使用结点的个数一分为二

可以按照类似中序遍历的做法,首先,创建当前节点的左孩子,然后创建当前节点,将该节点的left指针指向之前创建好的左孩子,然后创建右孩子,以这样的顺序,每次新创建的节点都对应单链表的顺序遍历中当前位置的节点,因此,用一个全局遍历表示当链表,在递归过程中不断修改当前单链表的指针,使每次创建的节点与单链表头节点对应。这里的start和end使用来作为终止条件

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

    TreeNode *rebuildBST(ListNode *&node,int start,int end)
    {
        if(start>end)   return NULL;
        //防止内存泄漏 mid=start+(end-start)/2;但是测试{1,3}(为偶数)用例通不过
        int mid=(start+end+1)>>1;
        TreeNode *leftChild=rebuildBST(node,start,mid-1);
        TreeNode *parent=new TreeNode(node->val);
        parent->left=leftChild;
        node=node->next;
        parent->right=rebuildBST(node,mid+1,end);
        return parent;
    }
};
时间: 2024-10-17 16:46:35

[Leetcode] Convert sorted list to binary search tree 将排好的链表转成二叉搜索树的相关文章

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

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

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

原题地址:http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 题意:将一个排序好的数组转换为一颗二叉查找树,这颗二叉查找树要求是平衡的. 解题思路:由于要求二叉查找树是平衡的.所以我们可以选在数组的中间那个数当树根root,然后这个数左边的数组为左子树,右边的数组为右子树,分别递归产生左右子树就可以了. 代码: # Definition for a binary tree node # class

LeetCode: Convert Sorted List to Binary Search Tree [109]

[题目] 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完全一样 [代码] /** * Definition for singly-linked list. * struct List

[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. 方法:为了使BST高度平衡,要找链表中的中值作为当前根节点. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) :

LeetCode: Convert Sorted Array to Binary Search Tree [108]

[题目] Given an array where elements are sorted in ascending order, convert it to a height balanced BST. [题意] 给定一个已排序的数组(不存在重复元素),将它转换成一棵平衡二叉搜索树. [思路] 由于平衡二叉树要求左右子树的高度差绝对值相遇等于1,也就是说左右子树尽可能包含相同数目节点. 则使用二分法来解本题即可. [代码] /** * Definition for binary 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直接访问任意一个元

LeetCode: Convert Sorted Array 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.SOLUTION 1:使用递归解决. base case: 当索引值超过时,返回null. 递归主体:构造根节点,调用递归构造左右子树.并将左右子树挂在根节点上. 返回值:返回构造的根节点. GITHUB: https:

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. 原题链接:https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题目:给定一个有正序链表,将其转换成一个二叉搜索树. 思路:能够依照之前的数组的思路来做.即找到中间值.再左右递归建树

[LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要将有序数组转为二叉搜索树,所谓二叉搜索树,是一种始终满足左<根<右的特性,如果将二叉搜索树按中序遍历的话,得到的就是一个有序数组了.那么反过来,我们可以得知,根节点应该是有序数组的中间点,从中间点分开为左右两个有序数组,在分别找出其中间点作为原中间点的左右两个子节点,这不就是是二分查找法的核