数据结构与算法学习笔记(八)

1.二叉树深度问题

二叉树的深度是指从根节点到最远叶子节点的路径上的节点数,也就是有多少层。

还是一样,不断细分,采用递归的方法不断的把二叉树劈开,先从根开始,也就是说我们每三个节点为一颗树,左根右,每层函数都用两个变量来接取当前判断的层数,如果当前的节点不为NULL,那么层数++,并且要做到记录层数,可以定义一个大范围变量,也可递归返回时叠加。

废话不多说,最大深度函数如下:

int maxDepth()
	{
		return maxDepth(root);            //当前二叉树的根节点
	}

	int maxDepth(Node* node)
	{
		int left = 0;
		int right = 0;

		if (node != NULL)
		{
			left++;
			right++;
		}

		if (node->left != NULL)
		{
			left += maxDepth(node->left);
		}

		if (node->right != NULL)
		{
			right += maxDepth(node->right);
		}

		return (left > right ? left : right);            /*不断叠加,不断得到每个子树的长                                             
                                                         度,最终获得最大值。*/
	}

还是画点草图更快理解。

2.折纸问题

折纸问题,也称为折叠问题,是指将一张纸条反复折叠后,能够得到多少种不同的形态。

当只折叠一次时,纸条有两种形态:重合和对折。当折叠两次时,除了以上两种形态,还会出现一些三角形、四边形等形态。当折叠三次时,形态更加丰富。实际上,每多折叠一次,都会增加更多的形态。

这里我们把凹下面称为down,突起称为up,于是我们可以通过二叉树来确定N次数下的折叠情况。

首先我们先规定根节点为down,左节点为down,右节点为up,每次折叠都会使当前没有左右节点的子节点增添左右节点(首次为更改根节点)。

说的直白点,每一次调用折叠函数把当前没有左右节点的节点补上左右节点。

Node* addNode(int n)
	{
		for (int i = 0; i < n; i++)
		{
			root=addNode(root);
		}
		return root;
	}

	Node* addNode(Node* node)
	{
		if (node == NULL)
		{
			node = new Node("down", NULL, NULL);
			return node;
		}

		if (node->left == NULL)
		{
			node->left = new Node("down", NULL, NULL);
			node->right = new Node("up", NULL, NULL);
			return node;
		}

		node->left=addNode(node -> left);
		node->right=addNode(node->right);

		return node;
	}

函数解析:

使用for循环来不断调用函数(原因在下段),判断当前节点为NULL只会在首次调用触发,接下来的判断左右节点是否为空,为空分情况就补上,不为空就让当前节点的左右节点继续调用折纸函数,判断他们的左右节点是否为空……

始终保持一个原则,赋值成功立即返回当前节点(一是可以一次调用只为节点添加一次左右节点,二是返回自身,赋值给上一级,最终给到root)

函数如下:

	Node* addNode(int n)
	{
		for (int i = 0; i < n; i++)
		{
			root=addNode(root);
		}
		return root;
	}

	Node* addNode(Node* node)
	{
		if (node == NULL)
		{
			node = new Node("down", NULL, NULL);
			return node;
		}

		if (node->left == NULL)                //判左判右都一样
		{
			node->left = new Node("down", NULL, NULL);
			node->right = new Node("up", NULL, NULL);
			return node;
		}

		node->left=addNode(node -> left);
		node->right=addNode(node->right);

		return node;
	}

利用中序遍历来验证(中序遍历在上一期有记录),读者也可用自己的方法遍历验证。

验证结果如下:

int main()
{
	PagerFolding fold;

	fold.addNode(3);            //折3次

	Queue* list = fold.midErgodic();

	cout << "当前最大深度为:" << fold.maxDepth() << endl;

	list->disList();
}

结果:
当前最大深度为:3
有7个节点
down
down
up
down
down
up
up

画个草图一目了然哦。

折纸问题不单单只是用于计算纸的突起和凹下。

更多应用场景如下:

  1. 制作纸质模型:折纸技巧在制作纸质模型中得到广泛应用,如飞机模型、汽车模型、建筑模型等。通过折叠纸张,可以制作出各种形状的三维模型,以便研究、教学和展示。

  2. 计算机图形学:在计算机图形学中,折纸问题被称为折纸转换,是一种常用的三维几何变换。通过折叠纸张,可以将二维平面图形转换为三维物体,用于制作游戏、动画和虚拟现实等。

  3. 机器人设计:折纸问题也被应用于机器人设计中,包括可折叠机器人、模块化机器人和软体机器人等。这些机器人可以通过折叠、旋转和弯曲等方式改变形态,以适应不同的任务和环境。

  4. 材料科学:折纸问题在材料科学中也有应用,如制作可折叠的电子设备和医学可折叠手术器械等。这些产品可以通过折叠减小体积,方便携带和储存,同时也具有更好的灵活性和适应性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值