• 算法系列(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
  • 相关阅读:
    Linux网络----数据包的接收过程
    Linux----运维必备的 13 款实用工具
    Linux----常用命令
    Linux----内核学习过程
    Linux性能及调优指南(翻译)之Linux进程管理
    Linux 下cut的使用
    Linux ps -ef和ps aux的区别
    Linux awk命令的一个简单应用
    安卓中的三种监听方式 (按钮控件举例)
    安卓中学习 sqlite
  • 原文地址:https://www.cnblogs.com/njuclc/p/13149499.html
Copyright © 2020-2023  润新知