zoukankan      html  css  js  c++  java
  • 5 Convert Sorted List to Binary Search Tree_Leetcode

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

    这题和sort list等题都比较相似,需要先用快慢指针的方法找到链表的中点,然后用recursive的方式构建左子树和右子树(用到的思想是Divide&Conquer),然后再构建好这个节点。

    编程时一点要注意:

    (1)dummy节点的使用可以帮助找到中点的prev节点

    但是dummy节点只有当用时再构造,建议不要提前建好当参数传进来,会非常不清晰。用完后最后记得delete,否则会memory leak. 也不能delete得过早,因为prev可能等于dummy.

    (2)边界情况

    当middle节点为head时,应注意,左子树为NULL,不要递归build。

    Code:

    /**
     * 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) {
            if(!head) return NULL;
            TreeNode* treeHead = buildTree(head);
            return treeHead;
        }
        
        TreeNode* buildTree(ListNode *head)
        {
            if(!head) return NULL;
            if(!head->next) return new TreeNode(head->val);
            
            ListNode* dummy = new ListNode(0);
            dummy->next = head;
            ListNode* prev = dummy, *slow = dummy->next, *fast = dummy->next->next;
            while(fast && fast->next)
            {
                slow = slow->next;
                prev = prev->next;
                fast = fast->next->next;
            }
    
            TreeNode* cur = new TreeNode(slow->val);
            
            TreeNode* left, *right;  // second error, cannot initialize left in the if-else
            right = buildTree(slow->next);
            if(prev != dummy)      // first error
            {
                prev->next = NULL;
                left = buildTree(head);
            }
            else left = NULL;
            
            cur->left = left;
            cur->right = right;
            
            delete dummy;  // first error, can not delete dummy too early if prev equals dummy
            
            return cur;
        }
    };
    

      

  • 相关阅读:
    网页制作-表单元素2
    网页制作-表单元素
    网页制作_表格
    网页制作常用标签
    IT新起之秀
    Android Studio 快捷键
    android github
    手机抓包 http tcp udp?
    Ubuntu16.04 Caffe 安装步骤记录(超详尽)(转载)
    ubuntu16.04 在cuda9.0环境下编译安装opencv2.4.13.7
  • 原文地址:https://www.cnblogs.com/avril/p/4029663.html
Copyright © 2011-2022 走看看