[LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)
问题
给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树。
初始思路
二叉搜索树高度平衡,意味着左右子树的高度要平衡。根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我们在待选节点中选择值为中位数的节点作为根节点,所有小于中位数的节点作为左子树,所有大于中位数的节点作为右子树,即可满足高度平衡的要求。由于题目给出的已经是排好序的单链表,我们只要每次选择中间的节点即可。然后通过递归处理左右子树,最终完成高度平衡二叉搜索树的构建。
最终完成代码如下:

1 class Solution { 2 enum ChildType 3 { 4 LEFT, 5 RIGHT 6 }; 7 public: 8 TreeNode *sortedListToBST(ListNode *head) 9 { 10 if(!head) 11 { 12 return nullptr; 13 } 14 15 16 ListNode* middle = FindMiddlePoint(head, nullptr); 17 18 TreeNode* root = new TreeNode(middle->val); 19 20 MakeSubTree(head, middle, root, LEFT); 21 MakeSubTree(middle->next, nullptr, root, RIGHT); 22 23 return root; 24 } 25 26 void MakeSubTree(ListNode* head, ListNode* end, TreeNode* parent, ChildType childType) 27 { 28 if(head == end) 29 { 30 return; 31 } 32 33 ListNode* middle = FindMiddlePoint(head, end); 34 35 TreeNode* treeNode = new TreeNode(middle->val); 36 37 if(childType == LEFT) 38 { 39 parent->left = treeNode; 40 } 41 else 42 { 43 parent->right = treeNode; 44 } 45 46 MakeSubTree(head, middle, treeNode, LEFT); 47 MakeSubTree(middle->next, end, treeNode, RIGHT); 48 } 49 50 ListNode* FindMiddlePoint(ListNode* head, ListNode* end) 51 { 52 int length = 0; 53 ListNode* node = head; 54 55 while(node != end) 56 { 57 ++length; 58 node = node->next; 59 } 60 61 length /= 2; 62 63 node = head; 64 for(int i = 0; i < length; ++i) 65 { 66 node = node->next; 67 } 68 69 70 return node; 71 } 72 };
Judge Small和Judge Large皆顺利通过。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步