力扣1382:将二叉搜索树便平衡
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1
,我们就称这棵二叉搜索树是 平衡的 。
示例 1:
输入:root = [1,null,2,null,3,null,4,null,null] 输出:[2,1,3,null,null,null,4] 解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。
示例 2:
输入: root = [2,1,3] 输出: [2,1,3]
思想:先用中序遍历将该搜素树存入数组中,然后创建平衡二叉树。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void inOrderTraverse(struct TreeNode* root, int* pos, int arr[]) {
if(root == NULL) return;
inOrderTraverse(root->left, pos, arr);
arr[(*pos)++] = root->val;
inOrderTraverse(root->right, pos, arr);
}
struct TreeNode* create(int *nums, int low, int high) {
if(low > high) return NULL;
int mid = (low + high) / 2;
struct TreeNode* t = (struct TreeNode*)malloc(sizeof(struct TreeNode));
t->val = nums[mid];
t->left = create(nums, low, mid - 1);
t->right = create(nums, mid + 1, high);
return t;
}
struct TreeNode* balanceBST(struct TreeNode* root){
int arr[10000];
int *pos = (int*)malloc(sizeof(int));
*pos = 0;
inOrderTraverse(root, pos, arr);
return create(arr, 0, *pos - 1);
}