给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。
示例:
输入:3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
struct TreeNode** buildtree(int start, int end, int* returnSize) {
if (start > end) {
*returnSize = 1;
struct TreeNode** ret = malloc(sizeof(struct TreeNode*));
ret[0] = NULL;
return ret;
}
*returnSize = 0;
struct TreeNode** alltree = malloc(0);
for (int i = start; i <= end; ++i) {
int leftsize;
struct TreeNode** leftree = buildtree(start, i - 1, &leftsize);
int rightsize;
struct TreeNode** rightree = buildtree(i + 1, end, &rightsize);
for (int left = 0; left < leftsize; ++left) {
for (int right = 0; right < rightsize; ++right) {
struct TreeNode* current = malloc(sizeof(struct TreeNode));
current->val = i;
current->left = leftree[left];
current->right = rightree[right];
(*returnSize)++;
alltree = realloc(alltree, sizeof(struct TreeNode*) * (*returnSize));
alltree[(*returnSize) - 1] = current;
}
}
free(leftree);
free(rightree);
}
return alltree;
}
struct TreeNode** generateTrees(int n, int* returnSize){
if(!n) {
(*returnSize) = 0;
return NULL;
}
return buildtree(1, n, returnSize);
}
二叉搜索树 递归实现
最新推荐文章于 2024-02-03 08:42:37 发布