二叉樹的遍歷和查找


前序遍歷

若二叉樹非空,則執行以下操作:

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

對於樹的知識還有很多,本文章主要介紹樹的遍歷和查找!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM