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
画个草图一目了然哦。
折纸问题不单单只是用于计算纸的突起和凹下。
更多应用场景如下:
-
制作纸质模型:折纸技巧在制作纸质模型中得到广泛应用,如飞机模型、汽车模型、建筑模型等。通过折叠纸张,可以制作出各种形状的三维模型,以便研究、教学和展示。
-
计算机图形学:在计算机图形学中,折纸问题被称为折纸转换,是一种常用的三维几何变换。通过折叠纸张,可以将二维平面图形转换为三维物体,用于制作游戏、动画和虚拟现实等。
-
机器人设计:折纸问题也被应用于机器人设计中,包括可折叠机器人、模块化机器人和软体机器人等。这些机器人可以通过折叠、旋转和弯曲等方式改变形态,以适应不同的任务和环境。
-
材料科学:折纸问题在材料科学中也有应用,如制作可折叠的电子设备和医学可折叠手术器械等。这些产品可以通过折叠减小体积,方便携带和储存,同时也具有更好的灵活性和适应性。