删除二叉树中以值x结点为根的子树

问题描述】编写递归算法,对于二叉树中每一个元素值为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;
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值