代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
float value;
struct Node *left;
struct Node *right;
}node;
//查找待插入点的父节点
node * findInsertLoc(node *p1, float insertValue)
{
//尝试一下递归
int sign = 1;
//sign表示是否找到待插入点的父节点,如果找到了置为0,跳出循环;没找到,则循环查找;
while(sign) {
//如果待插入值<当前根节点的value,且当前根节点的左子树为NULL的话,那么当前根节点
//就是待插入点的父节点;如果当前根节点左子树不为NULL,说明插入位置在当前根节点的左子树中
if(insertValue < p1->value) {
if (p1->left){
p1 = p1->left;
} else {
sign = 0;
}
} else {
//如果待插入值>当前根节点的value,且当前根节点的右子树为NULL的话,那么当前根节点
//就是待插入点的父节点;如果当前根节点右子树不为NULL,说明插入位置在当前根节点的右子树中
//上述else 改成if要出错
if (p1->right) {
p1 = p1->right;
}
else {
printf("\nright:sign is resigned, %f", p1->value);
sign = 0;
}
}
}
return p1;
}
node * buildTree(float arr[], int len)
{
node *rootnode = (node *)malloc(sizeof(node));
rootnode->value = arr[0];
rootnode->left = NULL;
rootnode->right = NULL;
for (int loc=1;loc<len; loc++) {
//查找带插入值的父节点
node *father = findInsertLoc(rootnode, arr[loc]);
node *descendant = (node *)malloc(sizeof(node));
descendant->value = arr[loc];
descendant->left = NULL;
descendant->right = NULL;
//node descendant = {arr[loc], NULL, NULL};会引发指针乱指
//根据待插入点和待插入点父节点的值的大小,确定应该插入父节点的左子树还是右子树
if (father->value < arr[loc]) {
father->right = descendant;
} else {
father->left = descendant;
}
}
return rootnode;
}
void inorder(node *p2) {
if (p2) {
inorder(p2->left);
printf(" %f ", p2->value);
inorder(p2->right);
}
}
void preorder(node *p2) {
if(p2) {
printf(" %f ", p2->value);
preorder(p2->left);
preorder(p2->right);
}
}
int main(int argc, char **argv)
{
float arr1[9] = {1.0, 13, 14, 8, 6, 7, 4, 3, 10};
int arrlen = sizeof(arr1)/sizeof(arr1[0]);
node *root = buildTree(arr1, arrlen);
//printf("\nend -- %f", root->left->value);
inorder(root);
return 0;
}
note:
1、通过node descendant = {value,NULL,NULL}方式创建节点,会导致指针乱指。具体原因暂不详;
2、数组的长度需要在数组创建的函数中,通过sizeof(arr)/sizeof(arr[0])计算。如果传递arr给函数,在被调用函数中通过上述表达式计算,长度计算有误。