[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     };
sortedListToBST

Judge Small和Judge Large皆顺利通过。

 

posted @ 2013-08-23 00:19  Shawnone  阅读(535)  评论(0编辑  收藏  举报