二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中所有的結點,使得每個結點被訪問依次且僅被訪問一次。
將整個二叉樹看作三部分:根、左子樹、右子樹。如果規定先遍歷左子樹,再遍歷右子樹,那麼根據根的遍歷順序就有三種遍歷的方式:前序根
左子樹右子樹
中序左子樹
根右子樹
後續左子樹
右子樹根
注意:由於樹的定義是按照遞迴進行的,其實對三種遍歷的概念也是乙個遞迴的描述過程。
使用三種演算法對下面這個樹進行遍歷:
先序遍歷:
從上往下排,先序遍歷為:根左右,即 1 ——4——2,然後重複剛才再往下遍歷,1 4 5 2 3 6,再往下 1 4 5 2 3 6 7.
中序遍歷:
從上往下排,先序遍歷為:左根右,即 4 ——1——2,然後重複剛才再往下遍歷,4 5 1 3 2 6,再往下 4 5 1 3 2 6 7.
後序遍歷:
從上往下排,先序遍歷為:左右根,即 4 ——2——1,然後重複剛才再往下遍歷,5 4 3 6 2 1,再往下 5 4 3 7 6 2 1.
已知一棵二叉樹的後序遍歷的序列為5 4 3 7 6 2 1,中序遍歷的序列為4 5 1 3 2 6 7,則先序遍歷的順序是什麼?
解析:知道中序遍歷以後,只要再知道前序遍歷或者後序遍歷其中乙個之後就可以推出另乙個。
中序遍歷:4 5 1 3 2 6 7
後序遍歷:5 4 3 7 6 2 1
在後續遍歷中,最後乙個肯定是根,因此1是乙個根。那麼從中序遍歷來看 4 5為左 3 2 6 7為右,即:
對於4和5而言,從後序遍歷來看,左子樹為5 4,4為根,從中序遍歷來看4 5,5為右子樹,則:
對於,右子樹從後序遍歷為3 7 6 2,2為根,從中序3 2 6 7來看,3為左子樹,6 7 為右子樹,即:
最後的6 7從後續遍歷為7 6,故6為根,可以得到二叉樹:
其實,二叉樹的每個左右子節點仍是一顆二叉樹,因此,我們可以使用遞迴的方式來定義二叉樹,二叉鍊錶結點的實現**如下:
package com.sxt.struct;
/* * 二叉鍊錶的結點
*/public class node
public node(object value)
@override
public string tostring()
}
然後使用乙個二叉樹介面,該介面可以有不同的實現類,每個類可以使用不同的儲存結構,比如順序結構或者鏈式結構:
package com.sxt.struct;
/* * 二叉樹的介面
* 可以有不同的實現類,每個類可以使用不同的儲存結構,比如順序結構或者鏈式結構
*/public inte***ce binaryinte***ce
資料結構學習筆記6 二叉樹及二叉樹的遍歷
我們前面講了陣列 鍊錶等線性資料結構,今天我們來看乙個非線性的資料結構 樹。之前我們說所謂的線性資料結構是指資料就像一條線一樣只有前和後兩個方向。而樹作為一種非線性的資料結構,肯定是不止這兩個方向。說起來其實樹也只有乙個前的方向,但是後就不一定是乙個了。雖然部分樹在極端情況下會退化成煉表,但是大多數...
資料結構學習(1) 二叉樹
二叉樹結構 public class treenode 前序遍歷 根結點,左子樹,右子樹 public static void prenode treenode node,listtreelist 中序遍歷 左子樹,根結點,右子樹 public static void midnode treenod...
資料結構學習筆記 二叉樹
樹,非線性表結構 樹有三個概念 高度從下向上數,起點是0 深度從上向下數,起點是0 層數從上向下數,起點是1 每個節點最多兩個叉 有兩種特殊二叉樹 滿二叉樹,除了葉子節點,每個節點都有左右兩個子節點 完全二叉樹,葉子節點都在最底下兩層,最後一層葉子節點都靠左排列,且除了最後一層,其它層節點個數都達到...