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

1 2
| 输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
|
示例 2:
提示:
- 树中节点的数目在范围
[1, 100]
内
-100 <= Node.val <= 100
迭代法(后序遍历)
访问到叶子节点时栈中元素为根节点到叶子结点的路径
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public List<String> binaryTreePaths(TreeNode root) { List<String> ans = new ArrayList<>(); String pathStr = new String();
if(root==null) return ans; Stack<TreeNode> st = new Stack<>(); TreeNode pre = null; while(root != null || !st.isEmpty()){ while(root!=null){ st.push(root); root = root.left; } root = st.peek(); if(root.right == null || root.right == pre){ if(root.left == null && root.right == null){ pathStr = ""; for(int i = 0 ; i < st.size()-1 ; i++){ TreeNode node = st.get(i); pathStr += String.valueOf(node.val); pathStr += "->"; } pathStr += st.peek().val; ans.add(pathStr); } root = st.pop(); pre = root; root = null; }else{ root = root.right; } } return ans; }
}
|
回溯法
使用先序遍历将所有访问的节点加入到路径path
遍历到叶子节点时,得到一条根节点到叶子结点的路径
若已访问完包含该节点的所有路径,则从路径中删除该节点,可以通过回溯实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { List<String> ans = new ArrayList<>(); List<Integer> path = new ArrayList<>(); String pathStr = new String();
public List<String> binaryTreePaths(TreeNode root) { traversal(root, path ,ans); return ans; }
public void traversal(TreeNode root, List<Integer> path , List<String> ans){ if(root==null) return; path.add(root.val);
if(root.left==null&&root.right==null){ String pathStr = ""; for(int i = 0 ; i < path.size()-1 ; i++){ pathStr += String.valueOf(path.get(i)); pathStr += "->"; } pathStr += String.valueOf(path.get(path.size()-1)); ans.add(pathStr); return; } if(root.left!=null){ traversal(root.left, path , ans); path.remove(path.size()-1); } if(root.right!=null){ traversal(root.right , path , ans); path.remove(path.size()-1); } } }
|