二叉树的所有路径

本文探讨如何求解从二叉树根节点到叶子节点的所有路径。通过思路解析、递归法和迭代法详细阐述解题过程。递归法中,以前序遍历为基础,利用回溯记录路径,并在遇到叶子节点时将路径加入结果集。迭代法则借助两个栈,一个用于模拟递归,另一个保存路径。
摘要由CSDN通过智能技术生成

在这里插入图片描述

思路

题目要我们求从根节点到叶子节点的路径,所以需要前序遍历,这样会很方便的让父节点指向孩子节点,从而找到对应的路径。
本题中会用到回溯,因为要把路径记录下来,然后回溯一个路径到另一个路径。
在这里插入图片描述

递归法

1、确定递归函数的参数和返回值
要传入根节点,记录每一条路径的path,存放结果集的result,返回值无

void traversal(TreeNode* cur,vector<int>& path,vector<string>& result)

2、确定递归的终止条件
本题中要找到叶子节点(当cur不为空,其左右孩子都为空),才开始结束的处理逻辑(把路径放到result里)

if(cur->left==nullptr && cur->right==nullptr)
{
   
  string sPath;
  for(int ii=0;i<path.size()-1;ii++){
   //将path里记录的路径转为string格式
     sPath+=to_string(path[ii]);
     spath+="->";
  }
  //循环中之所以不处理容器最后一个元素,是因为最后一个元素不需要->
  sPath+=to_string(path[path.size()-1]);//记录最后一个(叶子)结点
  result.push_back(sPath);//向result容器里收集一个路径
  return;
}

1、之所以没有判断cur为空,是因为下面的逻辑可以控制空节点不入循环。
2、这里使用了vector记录遍历过的路径,在递归终止时,需要把vector结构的path转为string格式,再把这个string

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值