有序链表转平衡二叉树

别说谁变了你拦得住时间么 提交于 2019-11-27 03:30:45
/* 根据链表构造二叉平衡树
 * 每次找到中点然后折半 分别作为左右子树
 *
 * */
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        // 找到当前链表的中点 构建二叉树 然后返回当前的根节点
        if(!head)   return NULL;
        // 1 2 3 pre p
        // 这里引入伪头结点是为了防止只有一个节点时(fast->)或者没有节点时  进行特判 但这里可以考虑只有一个或者0个节点情况 
        ListNode *pseudo = new ListNode(-1), *p=pseudo, *pre=pseudo, *fast=pseudo;
        pseudo->next = head;
        while(fast && fast->next){// 循环中一次也没执行就会出错 要么 针对这种情况特判 也么伪头结点
            pre = p;
            p = p->next;
            fast = fast->next->next;
        }
        pre->next = NULL; // 断链
        TreeNode *root = new TreeNode(p->val);
        root->left = sortedListToBST(pseudo->next);
        root->right = sortedListToBST(p->next);
        delete(pseudo);
        return root;
    }
};
/* 根据链表构造二叉平衡树
 * 每次找到中点然后折半 分别作为左右子树
 *
 * */
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {
        // 找到当前链表的中点 构建二叉树 然后返回当前的根节点
        if(!head)   return NULL;
        if(!head->next) return new TreeNode(head->val);
        ListNode *p=head, *pre=head, *fast=head;
        while(fast && fast->next){// 循环中一次也没执行就会出错 要么 针对这种情况特判 也么伪头结点
            pre = p;
            p = p->next;
            fast = fast->next->next;
        }
        pre->next = NULL; // 断链
        TreeNode *root = new TreeNode(p->val);
        root->left = sortedListToBST(head);
        root->right = sortedListToBST(p->next);
        return root;
    }
};

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!