1. 程式人生 > >Leetcode:108.將有序陣列轉換為二叉搜尋樹&&Leetcode:109.將有序連結串列轉換成二叉搜尋樹

Leetcode:108.將有序陣列轉換為二叉搜尋樹&&Leetcode:109.將有序連結串列轉換成二叉搜尋樹

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. 按照中序遍歷的順序,將陣列的值依次寫入二叉樹中。

                                         

C++程式碼
#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函式,改為連結串列的中序遍歷,其實差距不大。

                                              

C++程式碼
#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);
    }
};