问题描述】编写递归算法,对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。
【输入形式】
先序序列构造二叉树,结点数据类型为字符型,空结点用'#'表示。
输入要删除的结点值。
【输出形式】先序序列输出删除后的二叉树。
【样例输入】
ABC##D##C#F##
C
【样例输出】
ABD
【样例说明】
【评分标准】
其实总体来说,二叉树的操作用递归很简单:
1.找到了,进行操作
2.没找到,好,左右孩子指针传入该函数。
当然如果用到计数相关操作的话 return1+递归该函数即可
!!!设置递归不要忘记递归返回的条件!!!
tips:在树的结构体中:
1.定义指针 *lc与*rc时定义为指针类型 (此处与定义栈top base结构体不同)
2.采用递归的思想:
3.对与传入的T子树的根,对“根val”进行操作后,再将左右孩子指针传入的该函数中进行递归调用
4.在输入的时候 不用设置”停止标志“(由递归的性质决定 当所有的子树的叶子结点访问结束 为NULL时候 自动返回递归)
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef struct tree
{
char val; //定义根值
struct tree *lc, *rc; //定义左右孩子指针(结构体类型指针)此处和栈不同
}BiTNode,*BiTree;
void Create(BiTree &T) //构建树函数
{
char val; //对val所包含的值进行分支条件选择
cin >> val;
if (val == '#') //当该节点为#时 该树为空数
T = NULL;
else {
T = new BiTNode;
T->val = val; //输入该节点的根值 将左右孩子指针传入到创建树函数中
Create(T->lc); //递归 创建左孩子树
Create(T->rc); //递归 创建右孩子树
}
}
void Preorder(BiTree &T)
{
if (T) //T子树不为空
{
cout << T->val; //先序查找
Preorder(T ->lc);
Preorder(T ->rc);
}
}
void Find(BiTree &T,char ch)
{
if (T) //此树不为空
{
if (T->val == ch)
T = NULL; //找到目标子树后 将其命名为NULL
else //否则 将左右孩子指针传入的删除函数中去递归查找
{
Find(T->lc,ch);
Find(T->rc, ch);
}
}
}
int main()
{
BiTree T;
Create(T);
char ch;
cin >> ch;
Find(T,ch);
Preorder(T);
return 0;
}