将一个有序链表变为高度平衡二叉树

/**

基本思路:先利用快慢指针找到链表的中点,将这个中点作为二叉树的根节点。此时链表被中点分为前后两个部分,继续对前后两个部分递归找各部分的中点,将前部分的中点作为根节点的左儿子,后部分的中点作为根节点的右儿子。如此递归下去。

* 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) {

    return  toBST(head,NULL);

    }

private:

    TreeNode *toBST(ListNode *head, ListNode *end){

        if(head==end)return NULL;

        ListNode *fast,*slow;

        fast=slow=head;

        while(fast!=end&&fast->next!=end){

            slow=slow->next;

            fast=fast->next->next;

        }

        TreeNode *root=new TreeNode(slow->val);//这里创立节点千万不能  TreeNode *root; root->val=slow->val;

                                                                                 //因为这样只是声明了一个节点,而没有分配内存空间。

        root->left=toBST(head,slow);

        root->right=toBST(slow->next,end);       

        return root;

    }


};

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 5,454评论 0 6
  • # LinkedList系列总结 24/27 [x] Easy [x] Medium [x] Hard 这种题,多...
    Joshua介凌阅读 3,502评论 0 0
  • 2. Add Two Numbers 先初始化两个结点,一个用来做head,一个作为指引node不断向下延续的指针...
    Morphiaaa阅读 4,425评论 0 0
  • To write by Golang is next task. 一篇文章搞定面试中的二叉树 2018-02-07...
    HuJay阅读 3,199评论 0 0
  • 十几年的短发龄,七年的长发龄,一路短发走来,到长发,原来头发也有记忆,你愿意从头听听我的故事吗? 01 小时候,剪...
    冯丫阅读 7,455评论 2 2

友情链接更多精彩内容