给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:
1
/
2 3
5
输出: ["1->2->5", "1->3"]
解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3
本题其实是挺简单的,只考察遍历,只需要打印遍历的过程即可,如果用递归的话比较简单,代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<String> ans;
public List<String> binaryTreePaths(TreeNode root) {
ans = new ArrayList<>();
dfs(root,"");
return ans;
}
void dfs(TreeNode root,String p){
if(root == null){
return ;
}
if(p.length() == 0) p += root.val;
else {
p += "->";
p += root.val;
}
if (root.left == null && root.right == null){
ans.add(p);
return;
}
dfs(root.left,p);
dfs(root.right,p);
}
}
但是如果用迭代稍稍有点复杂,因为我们需要返回一个遍历的过程,因此我们需要维护一个string保存路径,如果我们每次都对路径进行修改,每次退出一个节点走另一条路就要对string修改的话,那么工程量有点大,我们为了简化代码可以维护一个栈,专门保存路径。
代码如下:
/**
* 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> ans = new ArrayList<>();
if(root == null) return ans;
Stack<TreeNode> nStack = new Stack<>();
Stack<String> pStack = new Stack<>();
String temp = new String();
temp += root.val;
pStack.push(temp);
nStack.push(root);
while (!nStack.isEmpty()){
TreeNode cur = nStack.pop();
String path = pStack.pop();
if (cur.left == null && cur.right == null){
ans.add(path);
}
if (cur.right != null){
nStack.push(cur.right);
pStack.push(path+"->"+cur.right.val);
}
if (cur.left != null){
nStack.push(cur.left);
pStack.push(path+"->"+cur.left.val);
}
}
return ans;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
网友评论