程序要求
假设二叉树中的结点为单个字符,且均不相等,采用二叉链存储,设计递归算法删除值为x的结点并删除该子树。
函数设计
(1) void CreatBiTNode(BiTNode * &b,char * str)
//从字符串创建二叉树
(2) void PrintBiTNode(BiTNode *b)
//输出二叉树
(3) void FreeBiTNode(BiTNode *&b)
//删除二叉树中的节点
(4) bool SearchBiTNode(BiTNode *&b,char Del)
//查找二叉树中的节点
(5) void main()
//主函数
二叉树的类型定义
typedef struct BiTNode{
char data;//节点数据
struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode;
完整代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct BiTNode{
char data;//数据
struct BiTNode *lchild, *rchild;//左右孩子指针
} BiTNode;
void CreatBiTNode(BiTNode * &b,char * str)
{
//从str中建立二叉链表
BiTNode *Temp[MAXSIZE],*p = NULL;//开辟临时二叉树和临时节点空间
int top = -1,k,j = 0;
char ch;
b = NULL;//初始化二叉树为空
ch = str[j];
while(ch != '\0')
{
switch(ch)
{
case '(': //遇到该节点的左节点
top++;
Temp[top] = p;
k = 1;
break;
case ')'://该节点子树创建完成
top--;
break;
case ','://遇到该节点的右子节点
k = 2;break;
default :
p = (BiTNode *)malloc(sizeof(BiTNode));
p -> data = ch;
p -> lchild = p -> rchild = NULL;
if(b == NULL)
b = p;//该节点为二叉树的根节点
else
{
if(k == 1)
Temp[top] -> lchild = p;//左节点入临时二叉树
else if(k == 2)
Temp[top] -> rchild = p;//右节点入临时二叉树
}
}
j++;
ch = str[j];//节点入树
}
}
void PrintBiTNode(BiTNode *b)
{
//输出二叉树
if(b != NULL)
{
printf("%c",b -> data);//先输出根节点
if(b -> lchild != NULL || b -> rchild != NULL)
{
//有孩子时输出孩子
printf("(");
PrintBiTNode(b -> lchild);//递归输出左孩子
if(b -> rchild != NULL)
{
printf(",");//有右孩子时输出
PrintBiTNode(b -> rchild);//递归输出右孩子
}
printf(")");//孩子输出结束
}
}
}
void FreeBiTNode(BiTNode *&b)
{
//删除节点及其子节点
if(b != NULL)
{
FreeBiTNode(b -> lchild);//递归删除左子树
FreeBiTNode(b -> rchild);//递归删除右子树
free(b);//释放根节点空间
b = NULL;//删除节点后设置指针悬空,否则会发生错误!!!
}
}
bool SearchBiTNode(BiTNode *&b,char Del)
{
//查找节点值为Del的节点
if(b == NULL)
return false;//树为空,找不到该节点,返回false
if(b -> data == Del)
{
FreeBiTNode(b);//找到要删除的节点,调用删除函数将其删除
printf("找到该节点,删除成功!\n");
return true;//找到该节点,返回true
}
else if(SearchBiTNode(b -> lchild,Del))
return true;//递归查找其左子树,找到节点,返回true
else if(SearchBiTNode(b -> rchild,Del))
return true;//递归查找其右子树,找到节点,返回true
else
return false;
}
void main()
{
//主函数
BiTNode *b;//定义二叉树
char Del;//定义要删除子树的值
char str[MAXSIZE];
printf("请输入二叉树:\n");
scanf("%s",&str);
CreatBiTNode(b,str);//创建二叉树
printf("二叉树创建成功!\n");
PrintBiTNode(b);//输出二叉树
printf("\n");
printf("请输入要删除节点的值:\n");
fflush(stdin);//清空缓冲区
scanf("%c",&Del);
if(SearchBiTNode(b,Del))//删除成功会返回true
PrintBiTNode(b);//输出删除后的二叉树
else if(SearchBiTNode(b,Del) == false) //删除失败会返回falase
printf("未查找到节点,删除失败!\n");
printf("\n");
}
测试数据