標籤:leetcode c++ 遞迴 tree
1.Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
2.Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
這裡兩道題目,是連在一起的兩題,給你一個排好序(升序)的數組或者鏈表,將它們轉為一棵平衡二叉樹。假設不排好序的話,一組隨機輸入的資料,就必須採用RBT或者AVL樹,這樣操作會變得更複雜,涉及到旋轉,但是這裡排好序了。所以,只要找到中位元,作為根,然後遞迴地根據中位元的左、右數列來構建左右子樹;
兩題的思路都是如上所述, 唯一的區別就是,鏈表尋找中位元會麻煩一些,需要引入fast、slow兩個指標,來尋找中位元,代碼如下:
1.Array
class Solution {public: TreeNode *Tree(int left, int right, vector<int> &num){ TreeNode *root = NULL; if (left <= right){ int cen = (left + right) / 2; root = new TreeNode(num[cen]); root->left = Tree(left, cen - 1, num); root->right = Tree(cen + 1, right, num); } return root; } TreeNode *sortedArrayToBST(vector<int> &num) { TreeNode *T = NULL; int N = num.size(); T = Tree(0, N - 1, num); return T; }};
2.link-list
class Solution {public: ListNode *findMid(ListNode *head){ //這裡如果鏈表中只有兩個數字,則mid返回的是head->next. if (head == NULL || head -> next == NULL) return head; ListNode *fast, *slow, *pre; fast = slow = head; pre = NULL; while (fast && fast->next){ pre = slow; slow = slow->next; fast = fast->next->next; } pre->next = NULL; return slow; } TreeNode *buildTree(ListNode *head){ TreeNode *root = NULL; ListNode *mid = NULL; if (head){ mid = findMid(head); root = new TreeNode(mid->val); if (head != mid){ root->left = buildTree(head); root->right = buildTree(mid->next); } } return root; } TreeNode *sortedListToBST(ListNode *head) { TreeNode *T; T = buildTree(head); return T; }};
LeetCode :: Convert Sorted Array (link list) to Binary Search Tree [tree]