深度优先遍历和广度优先遍历(Java)

广度优先遍历:

从根节点开始,遍历下一层中所有的子节点,然后再遍历子节点的下一层子节点

广度优先遍历可以在爬虫,社交网络寻找人脉关系,导航寻址中利用

实现方式:

利用一个队列,将根节点放入队列中,

队列里取出节点,进行遍历,将遍历子节点放入队列

 

 按照队列先进先出的特点,只有当前结点遍历完成后才会轮到下一层结点

代码实现

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)
               恢复初始状态(回溯的时候要用到)
        }
}   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值