C语言-二叉树递归方法

C语言-二叉树递归方法

C语言二叉树递归方法

简述

简单的递归算法可以对应线性的循环体,乃至多重循环。但在二叉树这一非线性数据结构上,则更加深刻的体现了纯递归应用的广泛性。

方法论

1.递归解决二叉树问题的方法总纲
结合压栈特性分类讨论与结点处理

2.压栈特性
许多问题需要压栈(叶子结点),故而先递归,再等返回后处理

3.结点处理
二叉树数据结构的根左右递归特性决定了我们一次只处理一个根左右抽象结点问题。

4.分类讨论(递归处理/递归结束)
一般情况下有这样几种方式:
(1).根空,根非空
eg:最简单的例子非属二叉树的遍历,在递归序的基础上(压栈特性)产生了前中后三种遍历方式,而我们的分类就是当前结点(根结点)是否为空,非空需要处理,空不处理。

void InorderTraversal(BinTree T)
{
	if(T)
	{
		InorderTraversal(T->Left);
		printf("%d",T->Data);
		InorderTraversal(T->Right);
	}
}

(2).根空,根非空左右空,左空右非空,左非空右空,左右非空(例子为是否二叉搜索树)

bool Is_BST(BinTree T, int* min, int* max)
{
	if(!T) return true; //根空
	if(T->Left==NULL&&T->Right==NULL) //根非空左右空
	{
		*min = *max = T->Data;
		return true;
	}
	if(T->Left&&T->Right==NULL) //左非空右空
	{
		if(Is_BST(T->Left, min,max)&&T->Data>*max)
		{
			*max = T->Data;
			return true;
		}
		else return false;
	}
	if(T->Left==NULL&&T->Right) //左空右非空
	{
		if(Is_BST(T->Right, min,max)&&T->Data<*min)
		{
			*min = T->Data;
			return true;
		}
		else return false;	
	}
	if(T->Left&&T->Right) //左右非空
	{
		return (Is_BST(T->Left, min,max)&&T->Data>*max&&Is_BST(T->Right,min,max)&&T->Data<*min);
	}
}

bool IsBST(BinTree T)
{
	int max=-1, min=-1;
	if(Is_BST(T,&min,&max)) return true;
	else return false;
}

(3).根结点是吗(如二叉搜索树),左子树是吗,右子树是吗

bool Is_BST(BinTree T,int *min, int *max)
{
	int lmin, lmax, rmin, rmax;
	if(!T) return true;
	if(!T->Left&&!T->Right)
	{
		*min = *max = T->Data;
		return true;
	} //根结点是吗
	bool Left_flag = false;
	bool Right_flag = false;
	if((T->Left&&Is_BST(T->Left,&lmin, &lmax)&&T->Data>lmax)||!T->Left) Left_flag = true; //左子树是吗
	if((T->Right&&Is_BST(T->Right,&rmin,&rmax)&&T->Data<rmin)||!T->Right) Right_flag = true; //右子树是吗
	if(Left_flag&&Right_flag)
	{
		if(T->Left) *min = lmin;
		else *min = T->Data;
		if(T->Right) *max = rmax;
		else *max = T->Data;
		return true;
	}
	else return false;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值