# 108. Convert Sorted Array to Binary Search Tree 題目:<https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/> 解法:divide and conquer,取出中間值當作root,用左邊的陣列建成左子樹,用右 邊的陣列建成右子樹即可。 Python3: ``` python 3 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None def listToTree(arr): nodes = [TreeNode(arr[0])] i = 0 j = 1 length = len(arr) while j < length: if arr[j] is not None: tmp = TreeNode(arr[j]) nodes[i].left = tmp nodes.append(tmp) j += 1 if j >= length: break if arr[j] is not None: tmp = TreeNode(arr[j]) nodes[i].right = tmp nodes.append(tmp) j += 1 i += 1 return nodes[0] def treeToList(root): if not root: return [] from collections import deque nodes = deque() nodes.append(root) arr = [] arr.append(root.val) while len(nodes): node = nodes.popleft() if node.left: nodes.append(node.left) arr.append(node.left.val) else: arr.append(None) if node.right: nodes.append(node.right) arr.append(node.right.val) else: arr.append(None) return arr class Solution: def sortedArrayToBST(self, nums: list[int]) -> TreeNode: if nums: length = len(nums) idx = length // 2 root = TreeNode(nums[idx]) root.left = self.sortedArrayToBST(nums[:idx]) root.right = self.sortedArrayToBST(nums[idx+1:]) return root if __name__ == '__main__': nums = [-10,-3,0,5,9] ans = Solution().sortedArrayToBST(nums) print(treeToList(ans)) ``` C: ``` c #include <stdio.h> #include <stdlib.h> #include <string.h> struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* strToTree(char *str) { char *token = strtok(str, ","); struct TreeNode **nodes = (struct TreeNode**)malloc(sizeof(struct TreeNode*)); nodes[0] = (struct TreeNode*)malloc(sizeof(struct TreeNode)); nodes[0]->val = atoi(token); nodes[0]->left = NULL; nodes[0]->right = NULL; int i = 0, len = 1; token = strtok(NULL, ","); while (token != NULL) { if (strcmp(token, "null") != 0) { len++; nodes = (struct TreeNode**)realloc(nodes, sizeof(struct TreeNode*) * len); nodes[len - 1] = (struct TreeNode*)malloc(sizeof(struct TreeNode)); nodes[len - 1]->val = atoi(token); nodes[len - 1]->left = NULL; nodes[len - 1]->right = NULL; nodes[i]->left = nodes[len - 1]; } token = strtok(NULL, ","); if (token == NULL) break; if (strcmp(token, "null") != 0) { len++; nodes = (struct TreeNode**)realloc(nodes, sizeof(struct TreeNode*) * len); nodes[len - 1] = (struct TreeNode*)malloc(sizeof(struct TreeNode)); nodes[len - 1]->val = atoi(token); nodes[len - 1]->left = NULL; nodes[len - 1]->right = NULL; nodes[i]->right = nodes[len - 1]; } token = strtok(NULL, ","); i++; } return nodes[0]; } void printLevelOrderWithNull(struct TreeNode* root) { struct TreeNode * bfs[10000] = {}; bfs[0] = root; int i = 0, len = 1; printf("%d ", root->val); while (i < len) { if (bfs[i]->left != NULL) { bfs[len++] = bfs[i]->left; printf("%d ", bfs[i]->left->val); } else printf("null "); if (bfs[i]->right != NULL) { bfs[len++] = bfs[i]->right; printf("%d ", bfs[i]->right->val); } else printf("null "); i++; } printf("\n"); } struct TreeNode* sortedArrayToBST(int* nums, int numsSize) { if (numsSize == 0) return NULL; int idx = numsSize / 2; struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode)); root->val = nums[idx]; root->left = sortedArrayToBST(nums, idx); root->right = sortedArrayToBST(nums + idx + 1, numsSize - idx - 1); return root; } int main() { int nums[] = {-10,-3,0,5,9}; int numsSize = sizeof(nums) / sizeof(nums[0]); struct TreeNode* ans = sortedArrayToBST(nums, numsSize); printLevelOrderWithNull(ans); return 0; } ``` ###### tags: `leetcode` `binary tree` `binary search tree` `divide and conquer`