广度优先遍历:
从根节点开始,遍历下一层中所有的子节点,然后再遍历子节点的下一层子节点
广度优先遍历可以在爬虫,社交网络寻找人脉关系,导航寻址中利用
实现方式:
利用一个队列,将根节点放入队列中,
队列里取出节点,进行遍历,将遍历子节点放入队列
按照队列先进先出的特点,只有当前结点遍历完成后才会轮到下一层结点
代码实现
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;
}
}
public List<List<Integer>> levelOrderBottom(TreeNode root) {
LinkedList<List<Integer>> result = new LinkedList<>();
if(root == null){
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root); //将根节点放入队列
while(!queue.isEmpty()){
List<Integer> list = new ArrayList();
int count = queue.size(); //当不为0时,保证在同一层遍历
for(int i = 0;i<count;i++){
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
result.add(list);
}
return result;
}
}
深度优先遍历
(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}