1. 程式人生 > 實用技巧 >LeetCode 109. 有序連結串列轉換為二叉樹

LeetCode 109. 有序連結串列轉換為二叉樹

題目描述連結:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/

解題思路:遞迴,分治。給出的連結串列為有序升序連結串列,找出中位數作為根節點,中位數之前的為左子樹,之後為右子樹。

如此遞迴在建立左子樹和右子樹即可。

LeetCode C++ 參考程式碼如下:

/**
 * 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) { return buildTree(head,NULL); } ListNode
* getMid(ListNode* left,ListNode* right){ ListNode *slow=left; ListNode *fast=left; while(fast!=right&&fast->next!=right){ slow=slow->next; fast=fast->next; fast=fast->next; } return slow; } TreeNode
* buildTree(ListNode* left,ListNode* right){ if(left==right){ return NULL; } ListNode* mid=getMid(left,right); TreeNode* root=new TreeNode(mid->val); root->left=buildTree(left,mid); root->right=buildTree(mid->next,right); return root; } };