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#include 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("errorn"); 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#include #include 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++); } }



