二叉树递归分而治之

二叉树的分治

分治和遍历 他们 虽然都是遍历一遍二叉树,但是遍历在某些时候解决不了问题
更倾向于分治

三种二叉树递归境界

看山还是山
看山不是山 懂得递归的子过程
看山还是山 不要想递归的子过程,就当成完整的子问题

前中后序遍历

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉树节点个数

int BinaryTreeSize(BTNode* root);

更加倾向于分而治之 ,根本身自己的1个+左子树的个数+右子树的个数

在这里插入图片描述


int TreeSize(BTNode* root)//分而治之
{
	if (root == NULL)
	{
		return 0;
	}
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}

//void TreeSize(BTNode* root, int* n)//遍历
//{
//	if (root == NULL)
//	{
//		return;
//	}
//	++(*n);
//	TreeSize(root->left, n);
//	TreeSize(root->right, n);
//}

二叉树的高度

当前树高度=左右子树高度大的+1
用三目写会有坑
在这里插入图片描述
因为丢失了返回值,递归过程中有大量重复的计算

这种用遍历就很难搞阿
在这里插入图片描述

在这里插入图片描述

int TreeHeight(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftheight = TreeHeight(root->left);
	int rightheight = TreeHeight(root->right);

	return leftheight > rightheight ? leftheight + 1 : rightheight + 1;
}

二叉树第k层节点个数

int BinaryTreeLevelKSize(BTNode* root, int k);
当前树的第K层节点数=·左子树的第K-1层个数+右子树的第K-1层个数

求第三层
转换为根左子树的第二层+根右子树的第二层
左子树的第二次转换为它左子树的第一层+它右子树的第一层

在这里插入图片描述

在这里插入图片描述

int TreeKLevel(BTNode* root, int k)
{
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

但是如果递归层次过深就会栈溢出

二叉树的后序

下列三种是一种后序遍历,访问根结点的操作发生在遍历其左右子树之后

求二叉树高度
先递归左子树,再右子树,左子树右子树都完了最后返回高度高的+1

int TreeHeight(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftheight = TreeHeight(root->left);
	int rightheight = TreeHeight(root->right);

	return leftheight > rightheight ? leftheight + 1 : rightheight + 1;
}

求二叉树节点个数

int TreeSize(BTNode* root)//分而治之
{
	if (root == NULL)
	{
		return 0;
	}
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}

归并排序
递归左子树有序,递归右子树有序,最后 [begin1,end1] [begin2,end2] 归并排序

在这里插入图片描述

快排是一种前序

先选出一个keyi 再递归左子树 再右子树

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值