Leetcode:108.將有序陣列轉換為二叉搜尋樹&&Leetcode:109.將有序連結串列轉換成二叉搜尋樹
阿新 • • 發佈:2019-02-03
Leetcode:108.將有序陣列轉換為二叉搜尋樹
將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序陣列: [-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹:
0
/ \
-3 9
/ /
-10 5
解題思路:
1. 計算陣列規模size = nums.size()。生成規模為size的平衡二叉搜尋樹,從高往低依次分配結點,直到規模等於size則停止分配。
2. 按照中序遍歷的順序,將陣列的值依次寫入二叉樹中。
#define hasLChild(x) (!(x->left==NULL)) #define hasRChild(x) (!(x->right==NULL)) class Solution { public: TreeNode* sortedArrayToBST(vector<int>& nums) { int size = nums.size(); if (size == 0) return NULL; //生成一個節點個數為size的平衡二叉樹。 TreeNode* root = Balanced_binary_tree(size); //中序遍歷順序,將陣列寫入平衡二叉樹。 In_order(root, nums); return root; } TreeNode* Balanced_binary_tree(int size) { queue<TreeNode*> Q; TreeNode* temp = new TreeNode(0); TreeNode* root = temp; Q.push(temp); size--; while (size > 0) { temp = Q.front(); temp->left = new TreeNode(0); Q.push(temp->left); size--; if (size > 0) { temp->right = new TreeNode(0); Q.push(temp->right); } size--; Q.pop(); } return root; } void In_order(TreeNode* root, vector<int>& nums) { if (hasLChild(root)) In_order(root->left, nums); root->val = nums[pos++]; if (hasRChild(root)) In_order(root->right, nums); } private: int pos = 0; }; |
Leetcode:109.將有序連結串列轉換成二叉搜尋樹
給定一個單鏈表,其中的元素按升序排序,將其轉換為高度平衡的二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定的有序連結串列: [-10, -3, 0, 5, 9], 一個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹: 0 / \ -3 9 / / -10 5
解題思路:
將連結串列轉換成陣列,然後呼叫108題的方法即可,當然,也可以修改In_order函式,改為連結串列的中序遍歷,其實差距不大。
#define hasLChild(x) (!(x->left==NULL)) #define hasRChild(x) (!(x->right==NULL)) class Solution108 { public: TreeNode* sortedArrayToBST(vector<int>& nums) { int size = nums.size(); if (size == 0) return NULL; //生成一個節點個數為size的平衡二叉樹。 TreeNode* root = Balanced_binary_tree(size); //中序遍歷順序,將陣列寫入平衡二叉樹。 In_order(root, nums); return root; } TreeNode* Balanced_binary_tree(int size) { queue<TreeNode*> Q; TreeNode* temp = new TreeNode(0); TreeNode* root = temp; Q.push(temp); size--; while (size > 0) { temp = Q.front(); temp->left = new TreeNode(0); Q.push(temp->left); size--; if (size > 0) { temp->right = new TreeNode(0); Q.push(temp->right); } size--; Q.pop(); } return root; } void In_order(TreeNode* root, vector<int>& nums) { if (hasLChild(root)) In_order(root->left, nums); root->val = nums[pos++]; if (hasRChild(root)) In_order(root->right, nums); } private: int pos = 0; }; class Solution{ public: TreeNode* sortedListToBST(ListNode* head) { vector<int> nums; while (head != NULL) { nums.push_back(head->val); head = head->next;} return Solution108().sortedArrayToBST(nums); } }; |