树的四种遍历方式


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

树的四种遍历方式

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

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

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

先序遍历

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

  • 树的结构类
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);    
    }
}

在这里插入图片描述

中序遍历

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

在这里插入图片描述

后序遍历

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

在这里插入图片描述

层序遍历

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

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

    在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值