zoukankan      html  css  js  c++  java
  • 算法系列(1)--广度优先遍历和深度优先遍历

    BFS(Breadth First Search)

    对于广度优先遍历,需要有一个队列。

    算法思路:

    1. 输出根节点的值,将根节点放入队列
    2. 从队列中弹出一个节点
    3. 如果该节点有左节点,输出左节点,并将左节点放入队列
    4. 如果该节点有右节点,输出右节点,并将右节点放入队列
    5. 重复2~4步骤,直到队列为空

    Java代码实现

    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
        }
    }
    */
    
    public class Solution {
        public ArrayList<Integer> BFS(TreeNode root) {
            ArrayList<Integer> lists = new ArrayList<Integer>();
            if(root==null)
                return lists;
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.offer(root);
            while(!queue.isEmpty()){
                TreeNode tree = queue.poll();
                if(tree.left!=null)
                    queue.offer(tree.left);
                if(tree.right!=null)
                    queue.offer(tree.right);
                lists.add(tree.val);
            }
            return lists;
        }
    }
    

    DFS(Depth First Search)

    深度优先遍历需要一个栈作为辅助

    算法思路:

    1. 将根节点压入栈
    2. 从栈中弹出一个节点,输出节点的值
    3. 如果存在右节点,将右节点压入栈中
    4. 如果存在左节点,将左节点压入栈中
    5. 重复2~4,直到栈为空
    /**
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
        
        public TreeNode(int val) {
            this.val = val;
        }
    }
    */
    
    public class Solution {
        public ArrayList<Integer> BFS(TreeNode root) {
            ArrayList<Integer> lists = new ArrayList<Integer>();
            if(root==null)
                return lists;
            Stack<TreeNode> stack=new Stack<TreeNode>();
            stack.push(root)
            while(!stack.isEmpty()){
            		TreeNode node = stack.pop()
            		lists.add(node.val)
            		if(node.rigth!=null){
            				stack.push(node.right)
            		}
            		if(node.left!=null){
            				stack.push(node.left)
            		}
            }
            return lists;
        }
    }
    

    递归实现

    public class Solution{
      	ArrayList<Integer> lists = new ArrayList<Integer>();
    		public ArrayList<Integer> BFS(TreeNode root) {
            if(root==null)
                return lists;
    				depthTraversal(root)
        }
      
      	public void depthTraversal(TreeNode node){
          	self.lists.add(node.val)
          	if(node.left!=null){
                depthTraversal(node.left)
            }
            if(node.right!=null){
             		depthTraversal(node.right)
            }
        }
    }
    

    参考

    1. https://www.cnblogs.com/xiaolovewei/p/7763867.html
  • 相关阅读:
    vue-router 实践
    修改vue中<router-link>的默认样式
    JSON.parse() 与 JSON.stringify() 的区别
    JS 中的异步操作
    CSS3 box-sizing:border-box的好处
    element ui 栅格布局
    css overflow用法
    koa中间件机制
    canvas 入门
    前端面试题:淘宝首页用了多少种标签
  • 原文地址:https://www.cnblogs.com/njuclc/p/13149499.html
Copyright © 2011-2022 走看看