树的四种遍历方式

目录

  • 树的四种遍历方式
    • 先序遍历
    • 中序遍历
    • 后序遍历
    • 层序遍历

不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!

树的四种遍历方式

树的遍历方式一般来说有四种:

  • 先序遍历
  • 中序遍历
  • 后序遍历
  • 层序遍历

只有层序遍历是属于广度优先搜索,剩下三个都是深度优先搜索的。

先序遍历

以最简单的二叉树进行遍历测试,可能在树的构建上很粗糙,主要表达遍历树的思想。

  • 树的结构类
package com.hnu;

//数据结构树,封装
public class TreeNode {
	//结点值
	public int val;
	//左孩子
	public TreeNode left;
	//右孩子
	public TreeNode right;
	//结点初始化
	public TreeNode(int val) {
		this.val = val;
	}
}
package com.hnu;

public class Main {
	
	//构造一棵树
	public static void main(String[] args) {
		TreeNode root = new TreeNode(1);
		TreeNode node2 = new TreeNode(2);
		TreeNode node3 = new TreeNode(3);
		TreeNode node4 = new TreeNode(4);
		TreeNode node5 = new TreeNode(5);
		TreeNode node6 = new TreeNode(6);
		TreeNode node7 = new TreeNode(7);
		root.left = node2;
		root.right = node3;
		node2.left = node4;
		node2.right = node5;
		node3.left = node6;
		node3.right = node7;
		preOrderTraversal(root);
	}
	
	//先序遍历   根,左孩子,右孩子
    public static void preOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.val+" ");
        preOrderTraversal(root.left);
        preOrderTraversal(root.right);    
    }
}

树的四种遍历方式_第1张图片

中序遍历

  • 只修改遍历方法即可
//中序遍历   左孩子,根,右孩子
    public static void preOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        preOrderTraversal(root.left);
        System.out.print(root.val+" ");
        preOrderTraversal(root.right);    
    }

树的四种遍历方式_第2张图片

后序遍历

  • 一样修改遍历方法
//后序遍历   左孩子,右孩子,根
    public static void preOrderTraversal(TreeNode root){
        if(root == null){
            return;
        }
        preOrderTraversal(root.left);
        preOrderTraversal(root.right);  
        System.out.print(root.val+" ");
    }

树的四种遍历方式_第3张图片

层序遍历

  • 因为先进去的结点要先出来,所以采用队列辅助遍历

    package com.hnu;
    
    import java.util.*;
    
    public class Main {
    	
    	//构造一棵树
    	public static void main(String[] args) {
    		TreeNode root = new TreeNode(1);
    		TreeNode node2 = new TreeNode(2);
    		TreeNode node3 = new TreeNode(3);
    		TreeNode node4 = new TreeNode(4);
    		TreeNode node5 = new TreeNode(5);
    		TreeNode node6 = new TreeNode(6);
    		TreeNode node7 = new TreeNode(7);
    		root.left = node2;
    		root.right = node3;
    		node2.left = node4;
    		node2.right = node5;
    		node3.left = node6;
      	node3.right = node7;
    		System.out.println(preOrderTraversal(root));
    	}
    	
    	//层序遍历    每一层的结点遍历
    	public static List<Integer> preOrderTraversal(TreeNode root){
            //辅助遍历
            Queue<TreeNode> queue = new LinkedList();
            //存储遍历的结点值
            List<Integer> array = new ArrayList<>();
            //遍历到末尾,返回
            if(root == null){
                return array;
            }
            //加入根
            queue.offer(root);
            //队列不空,一直循环
            while(!queue.isEmpty()){
                //取出结点
                TreeNode cur = queue.poll();
                //加入值
                array.add(cur.val);
                //左子树不空就加入队列,实现循环
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                //右子树不空就加入队列,实现循环
                if(cur.right != null){
                    queue.offer(cur.right);
                }
            }
            //最后返回遍历后得到的值
            return array;
        }
    }
    

    树的四种遍历方式_第4张图片

你可能感兴趣的:(算法,数据结构,java,算法)