c语言构建二叉树

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…
  1. 接下来就可以写代码了,我想只传空指针给函数得到二叉树,就得改变这个空指针的值,所以用了指针的指针
#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版权协议,转载请附上原文出处链接和本声明。