(算法整理)排序數組轉平行二叉樹(leetcode 108)

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;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章