1.num[10] = { 1,2,3,4,5,6,7,8,9,10 },排列成二叉树
2.父节点的位置为pos,左孩子的位置为2pos,右孩子的位置为2pos+1
3.那么递归结束条件为位置大于10时,
4.模拟几次递归,先序
- 创建节点1,值为1,左孩子位置为2
- 创建节点2,值为2,左孩子位置为4
- 创建节点3,值为4,左孩子位置为8
- 创建节点4,值为8,左孩子位置为16,超出,右孩子为17,超出,返回上层函数,即第三个节点右孩子位置为9
- 创建节点5,值为9…
- 接下来就可以写代码了,我想只传空指针给函数得到二叉树,就得改变这个空指针的值,所以用了指针的指针
#include<stdio.h>
#include<stdlib.h>
typedef struct Treenode {
struct Treenode* left;
struct Treenode* right;
int value;
}treenode;
void init(treenode** tree, int* num, int size, int pos);
void display(treenode* tree);
void main() {
int num[10] = { 1,2,3,4,5,6,7,8,9,10 };
int size = sizeof num / 4;
treenode* tree=NULL;
init(&tree, num, 10, 1);
display(tree);
}
void init(treenode** tree, int* num, int size, int pos) {
//这个if判断不了num为空,数组为空,指针的值是一个随机数而不是null
//此时size是2而不是0
if (!num) {
printf("输入空\n");
exit(1);
}
if (pos <= size) {
*tree = (treenode*)malloc(24);
if (!*tree) {
printf("error\n");
exit(1);
}
(*tree)->value = num[pos-1];
(*tree)->left = NULL;
(*tree)->right = NULL;
init(& ( (*tree)->left ), num, size, pos * 2);
init(& ( (*tree)->right ), num, size, pos * 2 + 1);
}
}
void display(treenode* tree) {
if (tree) {
printf("%d ", tree->value);
display(tree->left);
display(tree->right);
}
}
二叉搜索树,待修改
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
typedef struct Treenode {
struct Treenode* left;
struct Treenode* right;
int value;
}treenode;
void main() {
int num[10] = { 1,3,5,7,9,2,4,6,8,10 };
treenode* tree = NULL;
}
void init(treenode** tree,int* num,int size,int pos) {
if (pos <= size) {
if (!tree) {
(*tree) = (treenode*)malloc(24);
(*tree)->value = num[pos - 1];
(*tree)->left = NULL;
(*tree)->right = NULL;
}
if ((*tree)->value >= num[pos])
init((*tree)->left, num, size, pos++);
else
init((*tree)->right, num, size, pos++);
}
}
版权声明:本文为qq_42972591原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。