包括二叉排序树的增加、遍历和删除
#include <stdio.h>
#include <stdlib.h>
typedef int myType;
/*二叉排序树*/
typedef struct structTree{
myType node;
struct structTree* leftNode;
struct structTree* rightNode;
}Btree;
Btree* init();
void addChild(Btree* tree,int num);
void printTree(Btree* tree);
Btree* initHead(int headNode);
Btree* deleteOneNode(Btree* tree,myType num);
int main()
{
int headNode=10;
Btree* tree=initHead(headNode);
int a[9]={8,20,-5,9,11,30,-10,25,35};
for(int i=0;i<9;i++){
addChild(tree,a[i]);
}
printTree(tree);
deleteOneNode(tree,20);
printf("-------------先根遍历---------------\n");
printTree(tree);
return 0;
}
/*初始化一个节点*/
Btree* init(){
Btree* tree=(Btree*)malloc(sizeof(Btree));
tree->leftNode=NULL;
tree->rightNode=NULL;
return tree;
}
/*初始化头节点*/
Btree* initHead(int headNode){
Btree* tree=init();
tree->node=headNode;
return tree;
}
/*添加孩子节点*/
void addChild(Btree* tree,int num){
Btree* t=tree;
while(t!=NULL){
if(t->node > num){
if(t->leftNode==NULL){
t->leftNode=init();
t->leftNode->node=num;
break;
}
t=t->leftNode;
continue;
}else{
if(t->rightNode==NULL){
t->rightNode=init();
t->rightNode->node=num;
break;
}
t=t->rightNode;
continue;
}
}
}
/*先根遍历*/
void printTree(Btree* tree){
if(tree!=NULL){
printf("输出:%d\n",tree->node);
printTree(tree->leftNode);
printTree(tree->rightNode);
}
}
/*删除一个节点*/
Btree* deleteOneNode(Btree* tree,myType num){
if(tree==NULL){/*如果树为空,返回*/
return tree;
}else if(num > tree->node){/*如果num大于该节点,进入该节点右子树*/
tree->rightNode=deleteOneNode(tree->rightNode,num);
}else if(num < tree->node){/*如果num小于该节点,进入该节点左子树*/
tree->leftNode=deleteOneNode(tree->leftNode,num);
}else if(num==tree->node){/*如果相等,表示找到该节点,进行处理*/
/*如果该节点左右子树不空,则在该节点左子树上找一个最大的值放在该节点的位置,
并删除刚刚找到的在左子树上的最大值的那个节点*/
if(tree->leftNode!=NULL&&tree->rightNode!=NULL){
Btree* temp=tree->leftNode;
/*查找左边最大值*/
while(1){
if(temp->rightNode!=NULL){
temp=temp->rightNode;
}else{
break;
}
}
tree->node=temp->node;
tree->leftNode=deleteOneNode(tree->leftNode,temp->node);
}else if(tree->rightNode==NULL&&tree->leftNode==NULL){/*如果左右子树都空,删除该节点*/
Btree* temp2=tree;
tree=NULL;
free(temp2);
}else if(tree->leftNode==NULL){/*如果该节点左子树为空,直接将右子树挂在该节点上*/
Btree* temp2=tree;
tree=tree->rightNode;
free(temp2);
}else if(tree->rightNode==NULL){/*如果该节点右子树为空,直接将左子树挂在该节点上*/
Btree* temp2=tree;
tree=tree->leftNode;
free(temp2);
}
return tree;
}
}