前言
算法是计算机软件的基础,常见算法是软件开发的核心基本功,今年打算深入学习一些算法,记录一些算法理论以及最佳实践,希望可以坚持下去,关注我,我们一起学习,增强我们的基本功。
二叉树的路径
leetcode第257题需要查找二叉树的所有路径。
二叉树的路径就是根节点到每个叶子节点之间的路径。
我们只要使用前序遍历,每次遍历到叶子节点的时候收集一次路径,直到遍历到最后一个叶子节点,所有路径都可以收集完成。
比如下方二叉树,总共有3
条路径
路径1: 8 5 3
路径2: 8 5 6,我们可以发现求路径2的时候,我们只要回到5这个节点,再遍历右节点6
就可以得到路径2,这就是回溯
的过程。
路径3: 8 9, 我们可以发现求路径3的时候,我们只要回到8这个节点,再遍历右节点9
就可以得到路径3,这也是回溯的过程。
编码求二叉树的路径
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
class Solution {
List<String> result = new ArrayList<>();
public List<String> binaryTreePaths(TreeNode root) {
List<Integer> subResult = new ArrayList<>();
binaryTreePaths2(root, subResult);
return result;
}
//递归和回溯求解二叉树路径
public void binaryTreePaths2(TreeNode root, List<Integer> subResult) {
//前序遍历,按中左右顺序遍历
subResult.add(root.val);
if(root.left == null && root.right == null) {
String r = "";
for(int i=0; i<subResult.size(); i++) {
if(i>0) {
r = r + "->" + subResult.get(i);
} else {
r += subResult.get(i);
}
}
result.add(r);
return;
}
//遍历左子树
if(root.left != null) {
binaryTreePaths2(root.left, subResult);
//这里其实就是回溯
subResult.remove(subResult.size()-1);
}
//遍历右子树
if(root.right != null) {
binaryTreePaths2(root.right, subResult);
//这里其实就是回溯
subResult.remove(subResult.size()-1);
}
}
}
总结
看完今天的题目,发现回溯和递归是一起出现的。回溯是回退部分递归走过的路径,再接着继续遍历其他节点。
看完上面的代码,再看看这张图,是不是更好理解回溯了。
嘿,既然看到这里了,关注我们,一起学习技术,一起变强。