算法——二叉树的遍历 前序 中序 后序 广度优先 深度优先 (转)

二叉树的遍历

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);
        }

原文地址:https://www.cnblogs.com/xingchong/p/15137834.html