首页 > 其他分享 >递归路径问题

递归路径问题

时间:2024-04-27 17:56:30浏览次数:15  
标签:结点 遍历 cout 递归 int 路径 问题 括号

最近写一个矩阵连乘的问题,在打印括号的时候遇到了难题,不知道括号和序列怎么输出才能得到标准的加括号序列,在网上查到了一个博客发现是对的,在此记录一下,顺便和floyed打印路径的方式作对比,以此来加深对二叉树遍历的理解。
首先上矩阵连乘的图和代码

void Traceback(vector<int>p,int m,int n)  //表示的是矩阵的值,这里好像没什么用,因为实际上用的是s矩阵
{
	if (m == n) {
		cout << "A"<<m; return;
	}
	cout << "(";
	Traceback(p, m, s[m][n]);
	Traceback(p, s[m][n]+1, n);
	cout << ")";
	
}

这里的s数组就是指在哪个地方加上括号。画个图来方便理解:

两个问题:一是遇到叶结点直接返回,只要输出值即可。
二是左括号和右括号的时机,分别是在第一次遇到结点,和离开结点的时候加上。类似先序和后序遍历。
em,想了半天也不知道啥时候该输出值,啥时候该输出括号。记住遇到叶结点的时候直接返回了,不会深入叶结点的空间,而且每个叶结点只遇见一次,所以在叶节点打印值是最合理的。
对于每一个开裂的非叶子空间就要在进入空间时加左括号,离开时加右括号。这个确实不知道怎么切入。

void Traceback(vector<int>p,int m,int n)
{
	if (m == n) {
		cout << "A"<<m; return;
	}
	cout << "(";
	Traceback(p, m, s[m][n]);
	cout << ")";
	cout << "(";
	Traceback(p, s[m][n]+1, n);
	cout << ")";
}

这里给每个中序的地方加上了左括号和右括号,也是对的,但是出现了很多的冗余,因为即使有一个元素也被加上了括号。
结果如下:

两相对比,就发现这个加括号在我看来很古怪。你想啊,就单从函数本身来看,在两个递归之间断开加上括号不是很合理吗,s[m][n]也确实是其中的一个分割点。但是这么加就会有很多冗余,反而不如第一种标准的加法,虽然用二叉树的遍历方式可以理解,但是在自己思考的时候还是觉得递归可读性可理解性确实差。
Floyd算法代码:

void floyed(){

    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
                 p[i][j]=k;  //记录插点
            }
        }
    }
}

//打印路径的代码
void path(int i,int j)
{
    if(p[i][j]==0) return ; //没有插点就返回
    int k=p[i][j];
    path(i,k);    //打印插点
    cout<<"->"<<k<<"->";
    path(k,j);
}

int main()
{
    cout<<a<<"->"; 。//第一个点和最后一个点是不会被输出的,记得加上
    path(a,b);
    cout<<b;
}

这里的输出路径就是递归搜索两个点之间的插点,也就是中序遍历了,看下面的图也可以理解。

总结一下,这种递归二叉树的遍历最好还是画个图理解一下,搞清楚在叶结点和非叶子结点分别要干什么事,其实也不是很难( 不难才怪 ···)

标签:结点,遍历,cout,递归,int,路径,问题,括号
From: https://www.cnblogs.com/wl511/p/18162296

相关文章

  • 时钟双边沿触发问题
    问题题目链接:Dualedge题目让实现同时在时钟clk上升沿和下降沿都进行触发(triggered),但是提示说:我们无法通过(posedgeclkornegedgeclk)这种方式来实现,在FPGA中实际上是不存在这种双边沿触发的触发器的。FPGA(以及其他任何地方)上的触发器是一个具有一个时钟且仅对该时钟的一......
  • 详细:docker手动部署lnmp以及记录遇到的问题
    一、基本思路(背景)部署时间:2024.04.25主机为deepin20.9安装好docker,从官网下载nginxphpmysql三个镜像设置并启动相应三个容器,并配置portainer二、安装docker1.如果以前安装过老版本,请先卸载以前版本sudoaptremovedockerdocker-engine2.安装docker-ce与密钥管理与下......
  • 字符设备,write一直返回-1的问题
    在学习linux设备驱动时遇到的问题,请求大佬指点:1、insmodchar_dev.ko 2、mknod/dev/mydevicec24003、./test write返回-1,内核没有调用的device_write函数。 char_dev.c#include<linux/module.h>#include<linux/fs.h>#include<linux/cdev.h>#include......
  • 不同路径II
    https://leetcode.cn/problems/unique-paths-ii/description/?envType=study-plan-v2&envId=top-interview-150思路很简单,让obstacleGrid[i][j]代表走到i,j所需要的步数,然后obstacleGrid[i][j]=obstacleGrid[i-1][j]+obstacleGrid[i][j-1]只需要把上方和左边的但是有很多神......
  • 质数、最大公约数经典问题整理
    1、计数质数MX=5000000is_prime=[1]*MXis_prime[0]=is_prime[1]=0foriinrange(2,MX):ifis_prime[i]:forjinrange(i*i,MX,i):is_prime[j]=0classSolution:defcountPrimes(self,n:int)->int:return......
  • 三角形最小路径和
    题源:IOI飞入寻常百姓家classSolution:defminimumTotal(self,triangle:List[List[int]])->int:n=len(triangle)dp=[[0]*(i+1)foriinrange(n)]dp[0][0]=triangle[0][0]foriinrange(1,n):dp[i][0]......
  • 汉诺塔问题
    #include<iostream>voidhanoi(intn,charsource,chartarget,charauxiliary){ if(n>0){ //将n-1个盘子从source移动到auxiliary,使用target作为辅助 hanoi(n-1,source,auxiliary,target); //将最大的盘子从source移动到target std::cout......
  • ROS学习--添加依赖相关问题
    在自定义话题接口时,步骤如下:新建msg文件夹,并在文件夹下新建xxx.msg在xxx.msg下编写消息内容并保存在CmakeLists.txt添加依赖和msg文件目录在package.xml中添加xxx.msg所需的依赖编译功能包即可生成python与c++头文件其中在CmakeLists.txt中添加依赖和msg文件目录时需要将......
  • 笔记本1050ti运行DLinear模型遇到的问题
    1、windows没法运行shgitbash可以,但我需要在conda环境中,使用sh运行脚本,所以应该在安装conda后,先配环境变量,然后在gitbash窗口中执行condainitbash,就可以用在bash窗口中通过condaactivate进入conda环境了。2、运行sh,报错加载不到模块看报错最后一行上面的模块,pipuninsta......
  • vue,js直接导出excel,xlsx的方法,XLSX_STYLE 行高设置失效的问题解决
    1、先安装依赖:xlsx、xlsx-style、file-saver三个包npminstallxlsxxlsx-stylefile-saver2、引入:<script>import*asXLSXfrom'xlsx/xlsx.mjs'importXLSX_STYLEfrom'xlsx-style';import{saveAs}from'file-saver';exportdefau......