一、DFS深度优先遍历
从根节点开始,沿着一条路走到底,走到底之后,再回退上一个节点,从另一条路开始,这样不断重复,直到走完所有节点。
二、BFS广度优先遍历
按层遍历,一层一层走。
三、两种遍历的应用:
使用深度优先遍历实现
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
ArrayList<String> list = new ArrayList<String>();
String str = "";
return test(root,str,list);
}
public ArrayList<String> test(TreeNode root,String str,ArrayList<String> list){
// 如果节点不为空,则执行
if(root != null){
// 把值加到字符串后,如果在这里加-> 在第一次的时候会出现问题
str = str + root.val;
if(root.right == null && root.left == null){
// 都为空,返回字符串列表
list.add(str);
}else{
// 执行到这里表明该节点还不是叶子节点,加一个->
str = str + "->";
// 递归调用
test(root.left,str,list);
test(root.right,str,list);
}
}
return list;
}
}
广度优先遍历实现
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new ArrayList<String>();
// 如果为空,直接返回空列表
if(root == null){
return list;
}
// 创建两个队列,存储节点和节点对应的值
Queue<TreeNode> q1 = new LinkedList<TreeNode>();
Queue<String> q2 = new LinkedList<String>();
// 把第一个节点放进去
q1.offer(root);
q2.offer(root.val+"");
while(!q1.isEmpty()){
// 值都从队列中取;先进先出,往队列放的顺序,就是倒出来的顺序,可实现一层一层的走
TreeNode node = q1.poll();
String str = q2.poll();
if(node.left == null && node.right == null){
// 该节点为叶子节点,存下来路径
list.add(str);
}else{
// 如果左不为空,把左节点放到队列中,其值组成的String也一样
if(node.left != null){
q1.offer(node.left);
q2.offer(str + "->" + node.left.val);
}
// 如果右不为空,把左节点放到队列中,其值组成的String也一样
if(node.right != null){
q1.offer(node.right);
q2.offer(str + "->" + node.right.val);
}
}
}
return list;
}
}