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;
}
}
}