zoukankan      html  css  js  c++  java
  • 算法——二叉树的遍历 前序 中序 后序 广度优先 深度优先 (转)

    二叉树的遍历

    1、先序遍历
    先序遍历的顺序是:先根节点,再左节点,再右节点,即根节点->左节点->右节点。

    如:

    先序遍历的顺序为:0,1,5,2,3,4

    2、中序遍历

    中序遍历的顺序为,先左节点,再根节点,再右节点,即左节点->根节点->右节点。

    还是以下面的二叉树为例:

    中序遍历的顺序为:5,1,0,3,2,4

    3、后序遍历

    后序遍历的顺序是:先左节点,再右节点,再根节点,即左节点->右节点->根节点。

    还是以上面的二叉树为例:

    后序遍历的顺序为:5,1,3,4,2,0

    4、广度优先遍历

    广度优先遍历的顺序是:从根节点向下,从左到右遍历,下面还是拿上面的二叉树为例:

    广度优先遍历顺序为:0,1,2,5,3,4

     /**
         * 二叉树的广度优先遍历
         */
        public List<Integer> bfs(TreeNode root) {
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            List<Integer> list=new LinkedList<Integer>();
     
            if(root==null)
                return list;
            queue.add(root);
            while (!queue.isEmpty()){
                TreeNode t=queue.remove();
                if(t.left!=null)
                    queue.add(t.left);
                if(t.right!=null)
                    queue.add(t.right);
                list.add(t.val);
                }
            return list;

    5、深度优先遍历

    深度优先遍历的顺序为:先从根节点一直往下直到叶子节点进行遍历,然后叶子节点回到其父节点的右节点进行遍历。

    深度优先遍历顺序:0,1,5,2,3,4

    /**
         * 二叉树的深度优先遍历
         * @param root
         * @return
         */
        public List<Integer> dfs(TreeNode root){
            Stack<TreeNode> stack=new Stack<TreeNode>();
            List<Integer> list=new LinkedList<Integer>();
     
            if(root==null)
                return list;
         //压入根节点
            stack.push(root);
        //然后就循环取出和压入节点,直到栈为空,结束循环
            while (!stack.isEmpty()){
                TreeNode t=stack.pop();
                if(t.right!=null)
                    stack.push(t.right);
                if(t.left!=null)
                    stack.push(t.left);
                list.add(t.val);
            }
            return  list;
        }
     public void solution(TreeNode root)
        {
            List<Integer> list=new LinkedList<Integer>();
            depthTraversal(list,root);
        }
     
        private void dfs(List<Integer> list,TreeNode tn)
        {
            if (tn!=null)
            {
                list.add(tn);
     
                //每次先添加左节点,直到没有子节点点,返回上一级
                dfs(tn.left);
                dfs(tn.right);
            }

  • 相关阅读:
    设计模式学习——代理模式(Proxy Pattern)之 强制代理(强校验,防绕过)
    设计模式学习——代理模式(Proxy Pattern)
    设计模式学习——抽象工厂模式(Abstract Factory Pattern)
    最长字符串系列汇总
    窗口的最大值与最小值更新结构(滑动窗口)
    归并排序和归并排序应用(逆序对+小和)
    位运算在编程题的一些作用
    链表的排序(归并排序+快慢指针)
    Manacher算法解决最长回文子串长度问题
    回文数字的验证
  • 原文地址:https://www.cnblogs.com/xingchong/p/15137834.html
Copyright © 2011-2022 走看看