力扣1382:将二叉搜索树便平衡

发布于:2024-12-07 ⋅ 阅读:(129) ⋅ 点赞:(0)

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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);
}


网站公告

今日签到

点亮在社区的每一天
去签到