leetcode 108 排序數組轉平行二叉樹
算法描述:已知一個排序數組,現需要將其轉化爲一個高度平衡的二叉查找樹。(平衡二叉樹的定義:二叉樹中,任意兩個節點的高度差小於等於1)
思考:將排序數組轉化爲高度平衡的二叉查找樹,關鍵在於數據元素插入的二叉樹的順序
結論:每次選取數組的“中間元素”插入二叉樹,完成選擇後,再將數組劃分爲左右兩個數組(類似於二分查找),再遞歸地處理這兩個子數組,繼續選擇中間元素進行嘗試。
算法設計:設計遞歸函數preorder_insert用於對排序數組nums做劃分,同時每次尋找中間的數據nums[mid],其中mid=(begin+end)/2,將中間數據生成二叉樹結點,保存至node_vec中。
void preorder_insert(const std::vector<int> nums, std::vector<TreeNode*> &node_vec, int begin, int end) {
if (begin > end)
{
return;
}
int mid = (begin + end) / 2;
node_vec.push_back(new TreeNode(nums[mid]));
preorder_insert(nums, node_vec, begin, mid - 1);
preorder_insert(nums, node_vec, mid + 1, end);
}
TreeNode* sortArray2BST(const std::vector<int> nums) {
if (nums.size() == 0)
{
return NULL;
}
std::vector<TreeNode*> node_vec;
preorder_insert(nums, node_vec, 0, nums.size() - 1);
for (int i = 1; i < node_vec.size(); i++)
{
BST_insert_loop(node_vec[0], node_vec[i]);
}
return node_vec[0];
}
其中BST_insert_loop方法是二叉查找樹插入節點的函數,實現如下:
void BST_insert_loop(TreeNode* node, TreeNode* insert_node) {
while (node != insert_node)
{
if (insert_node->val < node->val)
{
if (!node->left)
{
node->left = insert_node;
}
node = node->left;
}
else
{
if (!node->right)
{
node->right = insert_node;
}
node = node->right;
}
}
}