目录
一、题目
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