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) : val(x), next(NULL) {}
 * };
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {//O(n^2) 
        if(!head) return NULL;
        //find the median of the listNode O(n)
        ListNode*  MidNode = findMedianOfList(head);
        TreeNode* root=new TreeNode(MidNode->val);
        root->right = sortedListToBST(MidNode->next);
	// set MidNode to NULL get the left part of the List
	ListNode* phead = new ListNode(0);
	phead->next = head;
	ListNode* newhead = phead;
	while(newhead->next && newhead->next!=MidNode){
		newhead = newhead->next;
	}
	newhead->next = NULL;
        root->left = sortedListToBST(phead->next);
        return root;
    }
    ListNode* findMedianOfList(ListNode* head){
        if(!head||!head->next) return head;
        ListNode* fast = head, *slow = head;
        while(fast && fast->next){
            fast = fast->next->next;
            slow = slow->next;
        }
        return slow;
    }
};

좋은 웹페이지 즐겨찾기