二叉树所有路径

目录

一、题目

二、解题思路

1、所有路径

 2、具体步骤

三、代码实现

四、二叉树专题文章专栏


一、题目

1、链接:力扣

2、题目内容:

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

 
示例 1:
输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

二、解题思路

1、所有路径

本题所有路径指根节点到所有叶子节点的路径,叶子节点即左右子树均为空,如下图:

所有路径为:1->2->4、1->3->5

 2、具体步骤

本题采用先序遍历,需要借助栈这一数据结构来实现,栈具有先进后出这一特点,每次元素入栈时,同时记录将经过该元素的路径也入栈,直到左右子树为空,即根节点到叶子节点路径。

(1)判断根节点是否为空,为空,直接放回,不为空,根节点入栈,以及对应路径入栈

(2)栈的前两个元素出栈(即节点+节点对应路径),然后:

        ①若左右子节点都为空,说明该节点为叶子节点,将对应节点路径添加到集合中,栈不为空,跳过②③步判断继续遍历,;

        ②判断右节点是否为空,不为空,节点以及节点对应路径入栈;

        ③判断左子树是否为空,不为空,节点以及节点对应路径入栈;

(3)重复步骤(2),继续判断是否遍历到叶子节点,节点2出栈

 (4)节点4出栈,重复步骤(2),左右子节点为空,路径添加

 

 (5)节点3出栈,重复步骤(2)

 (6)节点5出栈,重复步骤(2),左右子节点为空,路径添加

 

(7)栈空,遍历结束,返回路径集合

三、代码实现

 此时的栈存储类型为Object类型,因为既要存储树节点,又要存储字符串类型的路径

public class t13 {
    public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }

    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result=new ArrayList<>();
        if (root==null)
            return result;
        Stack<Object> stack=new Stack<>();
        stack.add(root);
        stack.add(root.val+"");
        while (!stack.isEmpty()){
            String path= (String) stack.pop();
            TreeNode node= (TreeNode) stack.pop();
            if (node.right==null&&node.left==null)
                result.add(path);
            if (node.right!=null){
                stack.add(node.right);
                stack.add(path+"->"+node.right.val);
            }
            if (node.left!=null){
                stack.add(node.left);
                stack.add(path+"->"+node.left.val);
            }

        }
        return result;
    }
}

四、二叉树专题文章专栏

https://blog.csdn.net/weixin_50616848/category_11818403.html

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swttws.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值