我在用c编写一个二叉排序树,但有个问题,尝试了很久,始终感到很迷惑,求大神解救!!
1. 有问题的程序
/* 二叉排序树: 性质:1.左子树上所有节点的值都小于根节点的值 2.右子树上所有节点的值都大于根节点的值 3.左右子树也分别为二叉排序树 */ # include <stdio.h> # include <malloc.h> //定义二叉树 typedef struct BiNode { int data; //数据域 struct BiNode * left; //指向左孩子 struct BiNode * right; //指向右孩子 }BiNode, * BiTree; //在二叉排序树T上查找元素key,返回该节点的指针 bool SearchBST(BiTree T, int key, BiTree &parent) { //在二叉排序树T上查找key, 找到了,则返回true //没有找到,则返回true,并返回双亲的指针parent if(NULL == T) //没有找到 { return false; } printf("%d\n", T->data); if(key == T->data) //找到key元素 { return true; } else if(key < T->data) //key值小于根节点的值,在左子树上查找 return SearchBST(T->left, key, T); else //key值大于根节点的值,在右子树上查找 { return SearchBST(T->right, key, T); } } //向二叉排序树上插入元素key void insertBST(BiTree &T, int key) { BiTree parent = NULL; //建立新节点 BiTree NewNode = (BiTree)malloc(sizeof(BiNode)); NewNode->data = key; NewNode->left = NULL; NewNode->right = NULL; if(T == NULL) //树为空时 T = NewNode; //先查找key元素是否在树T上 //如果不在,则把新元素插在parent后面 else { printf("%d\n", T->data); //打印根节点 if(!SearchBST(T, key, parent)) { printf("*parent = %d\n", parent->data); //????????调试的时候,发现错误出现在这, //parent的值没有传回来,用的是引用类型啊???为什么 if(key < parent->data) //新节点挂在双亲后面 parent->left = NewNode; else parent->right = NewNode; } } } int main(void) { int Arr[5] = {5,9,6,7,4}; int i; BiTree T = NULL; //二叉树的根节点 for(i = 0; i < 5; i++) insertBST(T,Arr[i]); //插入元素 return 0; }
2.下面的程序可以,那上面的程序问题出现在哪呢?
/* 二叉排序树: 性质:1.左子树上所有节点的值都小于根节点的值 2.右子树上所有节点的值都大于根节点的值 3.左右子树也分别为二叉排序树 */ # include <stdio.h> # include <malloc.h> //定义二叉树 typedef struct BiNode { int data; //数据域 struct BiNode * left; //指向左孩子 struct BiNode * right; //指向右孩子 }BiNode, * BiTree; //在二叉排序树T上查找元素key,返回该节点的指针 bool SearchBST(BiTree T, int key, BiTree parent, BiTree &p) { //在二叉排序树T上查找key, 找到了,则返回true //没有找到,则返回true,并返回双亲的指针parent if(NULL == T) //没有找到 { p = parent; //p指向双亲parent return false; } printf("%d\n", T->data); if(key == T->data) //找到key元素 { return true; } else if(key < T->data) //key值小于根节点的值,在左子树上查找 return SearchBST(T->left, key, T, p); else //key值大于根节点的值,在右子树上查找 { return SearchBST(T->right, key, T, p); } } //向二叉排序树上插入元素key void insertBST(BiTree &T, int key) { BiTree parent = NULL; BiTree p = NULL; //建立新节点 BiTree NewNode = (BiTree)malloc(sizeof(BiNode)); NewNode->data = key; NewNode->left = NULL; NewNode->right = NULL; if(T == NULL) //树为空时 T = NewNode; //先查找key元素是否在树T上 //如果不在,则把新元素插在parent后面 else { printf("%d\n", T->data); //打印根节点 if(!SearchBST(T, key, parent, p)) //没有找到,则插入 { printf("*p = %d\n", p->data); if(key < p->data) p->left = NewNode; else p->right = NewNode; } } } int main(void) { int Arr[5] = {5,9,6,7,4}; int i; BiTree T = NULL; //二叉树的根节点 for(i = 0; i < 5; i++) insertBST(T,Arr[i]); //插入元素 return 0; }
代码有问题啊,方法的开头处你把parent
赋值null
了