二叉树的遍历和查找

栏目: 数据库 · 发布时间: 6年前

内容简介:若二叉树非空,则执行以下操作:若二叉树非空,则执行以下操作:若二叉树非空,则执行以下操作:

前序遍历

若二叉树非空,则执行以下操作:

  1. 访问根结点;
  2. 先序遍历左子树;
  3. 先序遍历右子树

中序遍历

若二叉树非空,则执行以下操作:

  1. 中序遍历左子树;
  2. 访问根结点;
  3. 中序遍历右子树。

后序遍历

若二叉树非空,则执行以下操作:

  1. 后序遍历左子树;
  2. 后序遍历右子树;
  3. 访问根结点

实例说明

graph TD 3-->1 3-->5 1-->2 5-->4 5-->6

对于上面的二叉树而言,

  1. 前序遍历结果: 3 1 2 5 4 6
  2. 中序遍历结果: 1 2 3 4 5 6
  3. 后序遍历结果: 2 1 4 6 5 3

树的遍历代码实现

定义一个树结构

@ToString
class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;

  TreeNode(int x) {
    val = x;
  }
}

定义一个遍历方式的枚举

/**
 * 遍历的方向.
 */
enum Direct {
  /**
   * 中序
   */
  middle,
  /**
   * 前序
   */
  before,
  /**
   * 后序
   */
  after;
}

实现代码

/**
   * 遍历.
   */
  public void print(Direct direct) {
    StringBuffer stringBuffer = new StringBuffer();
    print(stringBuffer, this, direct, "ROOT:");
    System.out.println(stringBuffer.toString());
  }

  private void print(StringBuffer stringBuffer, TreeNode treeNode, Direct direct, String node) {
    if (treeNode != null) {

      if (direct == Direct.before) {
        stringBuffer.append(node + treeNode.val + "\n");
        print(stringBuffer, treeNode.left, direct, "L:");
        print(stringBuffer, treeNode.right, direct, "R:");
      } else if (direct == Direct.middle) {
        print(stringBuffer, treeNode.left, direct, "L:");
        stringBuffer.append(node + treeNode.val + "\n");
        print(stringBuffer, treeNode.right, direct, "R:");
      } else {
        print(stringBuffer, treeNode.left, direct, "L:");
        print(stringBuffer, treeNode.right, direct, "R:");
        stringBuffer.append(node + treeNode.val + "\n");
      }
    }
  }

二叉查询树实现了二分查找法

时间复杂度是Olog(n)到O(n),也就是说它最好的情况是Olog(n),当然运气不好,也就是你查询的是叶子节点,那就是O(n)了。

/*
   * 二分查找,最优时间复杂度OLog(n).
   */
  private TreeNode search(TreeNode x, int key) {
    if (x == null)
      return x;

    int cmp = key - x.val;
    if (cmp < 0)
      return search(x.left, key);
    else if (cmp > 0)
      return search(x.right, key);
    else
      return x;
  }

  public TreeNode search(int key) {
    return search(this, key);
  }
}

对于树的知识还有很多,本文章主要介绍树的遍历和查找!


以上所述就是小编给大家介绍的《二叉树的遍历和查找》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

黑客大曝光

黑客大曝光

Joel Scambray、Vincent Liu、Caleb Sima / 姚军 / 机械工业出版社华章公司 / 2011-10 / 65.00元

在网络技术和电子商务飞速发展的今天,Web应用安全面临着前所未有的挑战。所有安全技术人员有必要掌握当今黑客们的武器和思维过程,保护Web应用免遭恶意攻击。本书由美国公认的安全专家和精神领袖打造,对上一版做了完全的更新,覆盖新的网络渗透方法和对策,介绍如何增强验证和授权、弥补Firefox和IE中的漏洞、加强对注入攻击的防御以及加固Web 2.0安全,还介绍了如何将安全技术整合在Web开发以及更广泛......一起来看看 《黑客大曝光》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换