二叉树的三种遍历还不清楚?赶紧上车吧。

本文将从代码实现的视角和大家一块学习二叉树的前序、中序以及后续遍历,还没整明白的盆友们赶紧上车吧。

  • 打开你的IDEA,新建一个类BinarySearchTree,为什么要<T extends Comparable<? extends T>>呢?:
package com.mollychin.tree;

/**
 * Created by Mollychin on 2018/4/15.
 */
public class BinarySearchTree<T extends Comparable<? extends T>> {

  public static void main(String[] args) {

  }
}
  • 车门找到了么?接下来要干正事了。首先在BinarySearchTree里定义一个内部类BNode,代码如下:
/**
 * 二叉树的内部类,每一个结点的定义.
   */
  private static class BNode<T> {

    T element;
    BNode<T> right;
    BNode<T> left;

    /**
     * 结点类的构造函数1.
     */
    BNode(T element, BNode<T> right, BNode<T> left) {
      this.element = element;
      this.right = right;
      this.left = left;
    }

    /**
     * 结点类的构造函数2.
     */
    BNode(T element) {
      this.element = element;
    }
  }
  • 然后在BinarySearchTree类中加入private BNode<T> root;用以表示该树得根节点。将二叉树得数据结构绘制完成后,接下来要考虑对它进行操作,首先是insert操作。在此过程中便能体现出Comparable接口得强大之处了。
/**
 * 插入结点.
   */
  private void insert(T node) {
    root = insert(node, root);
  }

  /**
 * 插入结点的具体实现.
   */
  private BNode<T> insert(T node, BNode<T> t) {
    if (t == null) {
      return new BNode<T>(node, null, null);
    }
    int compareResult = node.compareTo(t.element);
    if (compareResult < 0) {
      t.left = insert(node, t.left);
    } else if (compareResult > 0) {
      t.right = insert(node, t.right);
    } else {
      ;
    }
    return t;
  }
  • 完成二叉树得插入操作后,接下来进行三种遍历:
  /**
 * 前序遍历.
   */
  private static void preOrder(BNode<Integer> node) {
    if (node != null) {
      System.out.print(node.element + "  ");
      preOrder(node.left);
      preOrder(node.right);
    }
  }

  /**
 * 中序遍历.
   */
  private static void midOrder(BNode<Integer> node) {
    if (node != null) {
      midOrder(node.left);
      System.out.print(node.element + "  ");
      midOrder(node.right);
    }
  }

  /**
 * 后序遍历.
   */
  private static void postOrder(BNode<Integer> node) {
    if (node != null){
      postOrder(node.left);
      postOrder(node.right);
      System.out.print(node.element+"  ");
    }
  }
  • 然后对上述步骤进行测试:
/**
 * 用以测试二叉树.
   */
  public static void main(String[] args) {
    int[] nodes = {4, 2, 6, 1, 3, 5, 7, 8, 10};
    BinarySearchTree<Integer> tree = new BinarySearchTree<>();
    // 插入结点值
    for (int i = 0; i < nodes.length; i++) {
      tree.insert(nodes[i]);
    }
    // 前序遍历结果:
    System.out.println("前序遍历:");
    preOrder(tree.root);
    System.out.println();
    // 中序遍历结果:
    System.out.println("中序遍历:");
    midOrder(tree.root);
    System.out.println();
    // 后续遍历结果:
    System.out.println("后序遍历:");
    postOrder(tree.root);
  }
  • 查看输出:
    这里写图片描述
  • 结构图:
    这里写图片描述

完整得代码如下:

package com.mollychin.tree;

/**
 * Created by Mollychin on 2018/4/15.
 */
public class BinarySearchTree<T extends Comparable<? super T>> {

  /**
   * 用以测试二叉树.
   */
  public static void main(String[] args) {
    int[] nodes = {4, 2, 6, 1, 3, 5, 7, 8, 10};
    BinarySearchTree<Integer> tree = new BinarySearchTree<>();
    // 插入结点值
    for (int i = 0; i < nodes.length; i++) {
      tree.insert(nodes[i]);
    }
    // 前序遍历结果:
    System.out.println("前序遍历:");
    preOrder(tree.root);
    System.out.println();
    // 中序遍历结果:
    System.out.println("中序遍历:");
    midOrder(tree.root);
    System.out.println();
    // 后续遍历结果:
    System.out.println("后序遍历:");
    postOrder(tree.root);
  }


  /**
   * 前序遍历.
   */
  private static void preOrder(BNode<Integer> node) {
    if (node != null) {
      System.out.print(node.element + "  ");
      preOrder(node.left);
      preOrder(node.right);
    }
  }

  /**
   * 中序遍历.
   */
  private static void midOrder(BNode<Integer> node) {
    if (node != null) {
      midOrder(node.left);
      System.out.print(node.element + "  ");
      midOrder(node.right);
    }
  }

  /**
   * 后序遍历.
   */
  private static void postOrder(BNode<Integer> node) {
    if (node != null){
      postOrder(node.left);
      postOrder(node.right);
      System.out.print(node.element+"  ");
    }
  }

  /**
   * 插入结点.
   */
  private void insert(T node) {
    root = insert(node, root);
  }

  /**
   * 插入结点的具体实现.
   */
  private BNode<T> insert(T node, BNode<T> t) {
    if (t == null) {
      return new BNode<T>(node, null, null);
    }
    int compareResult = node.compareTo(t.element);
    if (compareResult < 0) {
      t.left = insert(node, t.left);
    } else if (compareResult > 0) {
      t.right = insert(node, t.right);
    } else {
      ;
    }
    return t;
  }


  private BNode<T> root;

  /**
   * 二叉树的内部类,每一个结点的定义.
   */
  private static class BNode<T> {

    T element;
    BNode<T> right;
    BNode<T> left;

    /**
     * 结点类的构造函数1.
     */
    BNode(T element, BNode<T> right, BNode<T> left) {
      this.element = element;
      this.right = right;
      this.left = left;
    }

    /**
     * 结点类的构造函数2.
     */
    BNode(T element) {
      this.element = element;
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值