【树】257. 二叉树的所有路径
题目:
给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/ \
2 3
\
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
解答:
方法一:DFS
利用前序遍历,在递归栈中加入一个StringBuffer变量。使得二叉树的每个节点都有一个StringBuffer变量,记录从当前节点到根节点的路径。当当前节点是根节点时输出这个路径。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { List<String> res = new ArrayList<>(); public List<String> binaryTreePaths(TreeNode root) { preOrder(root,""); return res; } public void preOrder(TreeNode root, String path){ StringBuffer str = new StringBuffer(path); if(root == null) return; str.append(Integer.toString(root.val)); if(root.left == null && root.right == null){ res.add(str.toString()); } else{ str.append("->"); preOrder(root.left,str.toString()); preOrder(root.right,str.toString()); } } }
方法二:BFS
使用显示的队列。nodeQueue用来宽度遍历二叉树,pathQueue用来记录下当前节点到根节点的路径。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if(root == null) return res; Queue<TreeNode> nodeQueue = new LinkedList<>(); Queue<String> pathQueue = new LinkedList<>(); nodeQueue.offer(root); pathQueue.offer(Integer.toString(root.val)); while(!nodeQueue.isEmpty()){ TreeNode node = nodeQueue.poll(); String path = pathQueue.poll(); if(node.left == null && node.right == null){ res.add(path); } if(node.left != null){ nodeQueue.offer(node.left); pathQueue.offer(new StringBuilder(path).append("->").append(Integer.toString(node.left.val)).toString()); } if(node.right != null){ nodeQueue.offer(node.right); pathQueue.offer(new StringBuilder(path).append("->").append(Integer.toString(node.right.val)).toString()); } } return res; } }

浙公网安备 33010602011771号