程序是建立一颗二叉排序树,查找节点找到了返回其父节点,失败的时候返回NULL,删除节点分为四种情况:1、左子树和右子树都为空;2、左子树为空,右子树不为空;3、左子树不为空,右子树为空;4、左子树和右子树都不为空。
C语言版本(利用结构体实现):
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct BTree{
DataType data;
struct BTree *Tleft;
struct BTree *Tright;
}*BTree;
BTree CreateTree(); //建树
BTree insert(BTree root, DataType data);//插入节点
void InBTree(BTree root); //中序遍历
void PreBTree(BTree root); //先序遍历
void PostBTree(BTree root);//后序遍历
BTree findPostion(BTree root, int deleteNode, int *flags);//寻找合适的插入点
BTree delNode(BTree root, BTree parent, int flags); //删除树节点
int main(){
BTree root = NULL;
int flags = 0;
int deleteNode = 0;
BTree parent = NULL;//所删除节点的父节点
char choiceAgain = 'Y';
root = CreateTree();
printf("\n中序遍历: ");
InBTree(root);
printf("\n前序遍历: ");
PreBTree(root);
printf("\n后序遍历: ");
PostBTree(root);
printf("\n");
do{
printf("需要删掉的节点: ");
scanf("%d", &deleteNode);
parent = findPostion(root, deleteNode, &flags);
root = delNode(root, parent, flags);
printf("删除后的结果: ");
printf("\n中序遍历: ");
InBTree(root);
printf("\n前序遍历: ");
PreBTree(root);
printf("\n后序遍历: ");
PostBTree(root);
choiceAgain = 'N';
printf("\nDelete Again(Y) or N?: ");
getchar();
scanf("%c", &choiceAgain);
}while(choiceAgain == 'Y' || choiceAgain == 'y');
printf("\nDone!\n");
return 0;
}
BTree CreateTree(){
BTree root = NULL;
DataType temp = 0;
printf("请输入节点,以0结尾:\n");
scanf("%d", &temp);
while(temp != 0){
root = insert(