二叉树的遍历

一 概述

树的遍历可分为两类:

1. 深度优先遍历(DFS-Depth First Search):深度优先遍历是对于每一个可能的分支路径深入到不能再深入为止,而且每一个节点只能访问一次,对于二叉树的深度遍历可以分为三种:

  • 先序遍历:先访问树的根,然后遍历左子树,最后遍历右子树。
  • 中序遍历:先遍历左子树,然后访问根,最后遍历右子树。
  • 后序遍历:先遍历左子树,然后遍历右子树,最后访问根。

2. 广度优先遍历(BFS-Breath First Search):广度优先遍历也可以称为层序遍历,从上往下对每一层一次访问,在每一层中,从左往右访问结点,访问完一层就进入下一层,直至所有结点均被访问。

二 基于Java语言实现树的结构的定义与树节点初始化

           

1. 树结构的定义

package main.BinaryTree;

import java.util.List;

public class TreeNode {

    String value;
    TreeNode left;
    TreeNode right;

    public TreeNode(String value) {

        this.value = value;
    }

    public TreeNode(String value, TreeNode left, TreeNode right) {
        this.value = value;
        this.left = left;
        this.right = right;
    }
}

2.树节点的初始化

static TreeNode createBinaryTree() {

        //定义节点
        TreeNode G = new TreeNode("G");
        TreeNode D = new TreeNode("D");
        TreeNode E = new TreeNode("E", G, null);
        TreeNode B = new TreeNode("B", D, E);
        TreeNode H = new TreeNode("H");
        TreeNode I = new TreeNode("I");
        TreeNode F = new TreeNode("F", H, I);
        TreeNode C = new TreeNode("C", null, F);

        // 构造根节点
        TreeNode root = new TreeNode("A", B, C);
        return root;
    }

三 基于深度优先遍历实例

1. 先序遍历

   //先序遍历,即先访问根节点,然后遍历左子树,最后遍历右子树
    public void preOrder(TreeNode treeNode) {
        if (null != treeNode) {

            System.out.print(treeNode.value);

            if (null != treeNode.left) {
                preOrder(treeNode.left);
            }

            if (null != treeNode.right) {
                preOrder(treeNode.right);
            }
        }
    }

先序遍历:ABDEGCFHI

2. 中序遍历

//中序遍历,即先遍历左子树,然后访问根节点,最后遍历右子树
    public void midOrder(TreeNode treeNode) {
        if (null != treeNode) {

            if(null != treeNode.left) {
                midOrder(treeNode.left);
            }

            System.out.print(treeNode.value);

            if(null != treeNode.right) {
                midOrder(treeNode.right);
            }
        }
    }

中序遍历:DBGEACHFI

3. 后序遍历

  //后序遍历,即先遍历左子树,然后遍历右子树,最后访问根节点
    public void postOrder(TreeNode treeNode) {

        if(null != treeNode) {

            if(null != treeNode.left){
                postOrder(treeNode.left);
            }

            if(null != treeNode.right){
                postOrder(treeNode.right);
            }

            System.out.print(treeNode.value);
        }
    }

后序遍历:DGEBHIFCA

四 基于广度优先遍历实例

层序遍历

public void breathOrder(TreeNode treeNode) {

        if (null != treeNode) {

            LinkedList<TreeNode> linkedList = new LinkedList<>();
            linkedList.add(treeNode);
            TreeNode currentNode;

            while (!linkedList.isEmpty()) {

                currentNode = linkedList.poll();
                System.out.print(currentNode.value);

                if (null != currentNode.left) {
                    linkedList.add(currentNode.left);
                }

                if (null != currentNode.right) {
                    linkedList.add(currentNode.right);
                }
            }
        }
    }

层序遍历:ABCDEFGHI

五 森林和树遍历顺序的对应关系

二叉树森林
先根遍历先序遍历先根遍历
后根遍历中序遍历后根遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值