数据结构Java版之遍历二叉树(六)

  二叉树是我们在程序中用的最多的一种树(个人观点)。最简单的一个二叉树是由一个根节点,两个子节点(一左一右成左右孩子节点)组成。二叉树是数组和链表的结合,即包含了数组的快速查找优点,又包含了链表的快速添加删除的优点。熟练掌握二叉树的遍历方法是很有必要的。下面来介绍一下基于二叉树的四种遍历方式。

  下面我们以一个棵简单的二叉树为例来说明四种遍历:

  

创建树节点类:

    //树节点
    class TreeNode {
        public char val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(char x) {
            val = x;
        }
    }

  中序遍历:

  先遍历左孩子节点---根节点---右孩子节点

//中序遍历        左-根-右    (前中后:根的位置)
public void InOrder(TreeNode current){
    if(current != null) {
        InOrder(current.left);
        Visit(current);
        InOrder(current.right);
    }
}

  前序遍历:

  遍历根节点---左孩子节点---右孩子节点

//前序遍历        根-左-右
public void PreOrder(TreeNode current){
    if(current != null) {
        Visit(current);
        InOrder(current.left);
        InOrder(current.right);
    }
}

  后序遍历:

  遍历左孩子节点---右孩子节点---根节点

    //后续遍历        左-右-根
    public void PostOrder(TreeNode current){
        if(current != null) {
            InOrder(current.left);
            InOrder(current.right);
            Visit(current);
        }
    }

  层序遍历:

  同一层节点从左往右依次遍历。

    //层序遍历        同一层节点从左往右依次遍历  FIFO
    public void LevelOrder(TreeNode current){
        List<TreeNode> q = new ArrayList<TreeNode>();
        while(current != null) {
            Visit(current);
            if(current.left != null) {
                q.add(current.left);
            }
            if(current.right != null) {
                q.add(current.right);
            }
            if(q.isEmpty()) return ;
            current = q.remove(0);
        }
    }

以上就是四种基本遍历方式。下面我们来测试一下,首先写一个工具函数,用来显示当前节点的值。

    //*********辅助工具****************
    public void Visit(TreeNode node) {
        System.out.print(node.val);
    }

写Test测试函数:

  

    @Test
    public void fun() {
        TreeNode root = new TreeNode(‘+‘);
        root.left = new TreeNode(‘-‘);
        root.right = new TreeNode(‘E‘);
        root.left.left = new TreeNode(‘*‘);
        root.left.right = new TreeNode(‘D‘);
        root.left.left.left = new TreeNode(‘/‘);
        root.left.left.right = new TreeNode(‘C‘);
        root.left.left.left.left = new TreeNode(‘A‘);
        root.left.left.left.right = new TreeNode(‘B‘);

        System.out.println("中序遍历:");
        InOrder(root);
        System.out.println();
        System.out.println("前序遍历:");
        PreOrder(root);
        System.out.println();
        System.out.println("后序遍历:");
        PostOrder(root);
        System.out.println();
        System.out.println("层序遍历:");
        LevelOrder(root);
        System.out.println();
    }

由上面的测试函数得到遍历结果:

全部代码:

package tree;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
/**
 * 二叉数的遍历
 *                     +
 *                 -         E
 *             *        D
 *        /        C
 *   A        B
 * @author Ranter
 *
 */
public class BinaryTree {
    @Test
    public void fun() {
        TreeNode root = new TreeNode(‘+‘);
        root.left = new TreeNode(‘-‘);
        root.right = new TreeNode(‘E‘);
        root.left.left = new TreeNode(‘*‘);
        root.left.right = new TreeNode(‘D‘);
        root.left.left.left = new TreeNode(‘/‘);
        root.left.left.right = new TreeNode(‘C‘);
        root.left.left.left.left = new TreeNode(‘A‘);
        root.left.left.left.right = new TreeNode(‘B‘);

        System.out.println("中序遍历:");
        InOrder(root);
        System.out.println();
        System.out.println("前序遍历:");
        PreOrder(root);
        System.out.println();
        System.out.println("后序遍历:");
        PostOrder(root);
        System.out.println();
        System.out.println("层序遍历:");
        LevelOrder(root);
        System.out.println();
    }

    //****************************************************************

    //中序遍历        左-根-右    (前中后:根的位置)
    public void InOrder(TreeNode current){
        if(current != null) {
            InOrder(current.left);
            Visit(current);
            InOrder(current.right);
        }
    }
    //前序遍历        根-左-右
    public void PreOrder(TreeNode current){
        if(current != null) {
            Visit(current);
            InOrder(current.left);
            InOrder(current.right);
        }
    }
    //后续遍历        左-右-根
    public void PostOrder(TreeNode current){
        if(current != null) {
            InOrder(current.left);
            InOrder(current.right);
            Visit(current);
        }
    }
    //层序遍历        同一层节点从左往右依次遍历(使用队列层序遍历)
    public void LevelOrder(TreeNode current){
        List<TreeNode> q = new ArrayList<TreeNode>();
        while(current != null) {
            Visit(current);
            if(current.left != null) {
                q.add(current.left);
            }
            if(current.right != null) {
                q.add(current.right);
            }
            if(q.isEmpty()) return ;
            current = q.remove(0);
        }
    }

    //*********辅助工具****************
    public void Visit(TreeNode node) {
        System.out.print(node.val);
    }

    //树节点
    class TreeNode {
        public char val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(char x) {
            val = x;
        }
    }
}

原文地址:https://www.cnblogs.com/ranter/p/9229809.html

时间: 2024-08-08 14:48:16

数据结构Java版之遍历二叉树(六)的相关文章

剑指Offer面试题39(Java版):二叉树的深度

题目:输入一棵二叉树的根节点,求该数的深度.从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度. 例如,如下图的二叉树的深度为4,因为它从根节点到叶结点的最长的路径包含4个结点(从根结点1开始,经过2和结点5,最终到达叶结点7) 我们可以从另一种角度来理解树的深度.如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度+1.同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树+1.如果既有左子树又

【TOJ 1224】数据结构练习题――后序遍历二叉树

Description 给定一颗二叉树,要求输出二叉树的深度以及后序遍历二叉树得到的序列.本题假设二叉树的结点数不超过1000. Input 输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树.每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理.二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替). Output 输出每棵二叉树的深度以及后序遍历二叉树得到

数据结构 Java版二叉排序树

二叉搜索树,又称为二叉查找树和二叉搜索树.它或者是一颗空树,或者具有下列性质的二叉树. 1 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值. 2 若它的右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值. 3 它的左.右子树也都为二叉搜索树. 构造一颗二叉搜索树,目的不是为了排序,而是为了提高查找.插入和删除关键字的速度.一个有序数据集上的查找速度总是要快于无序数据集,而二叉搜索树这种非线性的结构,也有利于插入和删除的实现. 二叉搜索树的查找性能取决于二叉搜索树的形状,问

剑指Offer面试题25(Java版):二叉树中和为某一值的路径

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径. 如下图,输入二叉树和整数22,则打印出两条路径,第一条路径包含结点10,12,第二条路径包含的结点为10,5,7. 一般的数据结构和算法的教材都没有介绍树的路径,因此对大多数应聘者而言,这是一个新概念,也就很难一下子想出完整的解题思路.这个时候我们可以试着从一两个具体的例子入手,找到规律. 以图中的二叉树为例分析,由于路径是从根节点出发到叶结点,也就是说

剑指Offer面试题19(Java版):二叉树的镜像

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像 二叉树的结构定义为: package utils; public class BinaryTreeNode { public int value; public BinaryTreeNode leftNode; public BinaryTreeNode rightNode; public BinaryTreeNode(){ } public BinaryTreeNode(int value){ this.value = value ;

研磨数据结构与算法-12遍历二叉树

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

java构造和遍历二叉树

[分析] 二叉树的结构:根节点.左子树.右子树.其中左子树的值必须小于根节点,右子树的值必须大于根节点.构造这种树结构,就是创建一个类,并提供一个方法,当给定一个值时,它能够自动创建节点并自动挂到二叉树的合适位置. 二叉树的遍历:分为先序遍历.中序遍历和后序遍历.先序遍历:根.左.右. 中需遍历:左.根.右. 后续遍历:左.右.根. 二叉树的应用:加密解密.文件压缩.快速查询.快速遍历等. 1.构造二叉树的节点对象,并提供插入方法. 1 private int data; //存放节点数据 2

数据结构Java版之深度优先-图(十二)

这里用深度优先遍历存在矩阵里面的图. 深度优先利用的是栈的FIFO特性.为此遍历到底后,可以找到最相邻的节点继续遍历.实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了. 源码: package mygraph; import java.util.Stack; public class DFS_Vertex { //创建一个我们需要的节点类 class Vertex { private char lable; private int val; private boolea

JAVA按层级遍历二叉树

/** * @author cj 2017年7月14日下午1:14:31 */ package com.yuanye.algorithm; import java.util.LinkedList; import java.util.List; public class BinaryTree { // private static List<Node> currentLevelNodes=new ArrayList<>(); // private static List<Nod