如何判斷二叉樹的前序,中序,後序遍歷

2021-10-23 17:28:20 字數 3480 閱讀 6094

最近複習題中看到二叉樹,對於它的前序,中序,後序遍歷的判斷有些模糊,後經查閱資料,將學習過程記錄在部落格中。

對一棵二叉樹進行遍歷,我們可以採取3中順序進行遍歷,分別是前序遍歷、中序遍歷和後序遍歷。這三種方式是以訪問父節點的順序來進行命名的。假設根節點是n,左節點是l,右節點是r,那麼對應的訪問遍歷順序如下:

所以,對於以下這棵樹,三種遍歷方式的結果是:

如果還是不明白怎樣判斷的,那麼下面是詳細描述

其實,只要知道其中任意兩種遍歷的順序,我們就可以推斷出剩下的一種遍歷方式的順序,這裡我們只是以:知道前序遍歷和中序遍歷,推斷後序遍歷作為例子,其他組合方式原理是一樣的。要完成這個任務,我們首先要利用以下四個特性

範例如下(示例):

我們以乙個例子做一下這個過程,假設:

前序遍歷的順序是: cabghedf

中序遍歷的順序是: ghbacdef

第一步,我們根據特性1

,可以得知根節點是c,然後,根據特性3

,我們知道左子樹是:ghba,右子樹是:def

c/ \

ghba def

第二步,取出左子樹,左子樹的前序遍歷是:abgh,中序遍歷是:

ghba

(從上面題目中得出)

根據特性1和3

,得出左子樹的根節點是a,並且a沒有右子樹。

c/ \

a def

/ghb

第三步,使用同樣的方法,前序是bgh,中序是ghb,得出根節點是b,gh為b的左子樹,並且b沒有右子樹。

再看前序中gh,g在h的前面,也就是說,g是先前序遍歷訪問的,則得到h是g的左子樹

c/ \

a def/b

/

g /

h

第四步,回到右子樹,它的前序是edf,中序是def,依然根據特性1和3

,得出根節點是e,左節點是d,右節點為f。

c/ \

a e

// \

b d f

/

g /

h

到此,我們得到了這棵完整的二叉樹,因此,它的後序遍歷就是:hgbadfec

下面我們使用程式來實現根據前序遍歷和中序遍歷得到後續遍歷。

首先我們需要建立節點的實體類:

/**

* 二叉樹的節點資料結構

*/public

class

treenode

/** * @param key 層序編碼

* @param data 資料域

*/public

treenode

(string key, string data)

/** * 序號

*/public string getkey()

public

void

setkey

(string key)

/** * 值

*/public string getdata()

public

void

setdata

(string data)

}

具體實現**

/**

* 給出前序遍歷和終須遍歷,求得二叉樹及後續遍歷

* created by sschen on 17/5/2.

* * 前序遍歷 n->l->r

* 中序遍歷 l->n->r

* 後序遍歷 l->r->n

* * 特性a,對於前序遍歷,第乙個肯定是根節點;

* 特性b,對於後序遍歷,最後乙個肯定是根節點;

* 特性c,利用前序或後序遍歷,確定根節點,在中序遍歷中,根節點的兩邊就可以分出左子樹和右子樹;

* 特性d,對左子樹和右子樹分別做前面3點的分析和拆分,相當於做遞迴,我們就可以重建出完整的二叉樹;

*/public

class

binarytreefind

/** * 遞迴計算節點列表

* @param pr 前序遍歷字串

* @param in 中序遍歷字串

* @param index 層級序號

* @return 節點

*/private

static treenode gettree

(string pr, string in, string index)

//前序遍歷的第乙個節點必然是該段根節點

string firstnodevalue = pr.

substring(0

,1);

treenode node =

newtreenode

(index, firstnodevalue);if

(in.

length()

==1)//得到跟節點在中序遍歷中的位置

int ileftlength = in.

indexof

(firstnodevalue);if

(ileftlength ==0)

else

if(ileftlength == in.

length()

-1)else

return node;

}/**

* 對二叉樹進行後續遍歷

* @param subtree 二叉樹

*/public

static

void

postorder

(treenode subtree)

}public

static

void

visted

(treenode subtree)

}

執行結果為

key:root-l-l-l-r--name:k

key:root-l-l-l--name:g

key:root-l-l--name:d

key:root-l-r-l-l--name:l

key:root-l-r-l--name:h

key:root-l-r-r--name:i

key:root-l-r--name:e

key:root-l--name:b

key:root-r-r-r--name:j

key:root-r-r--name:f

key:root-r--name:c

key:root--name:a

掌握了二叉樹的四個特性,也就可以清楚的判斷二叉樹的前序,中序,後序遍歷。

二叉樹遍歷(前序,中序,後序

二叉樹的遍歷有三種方式,如下 1 前序遍歷 dlr 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根 左 右。2 中序遍歷 ldr 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左 根 右。3 後序遍歷 lrd 首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左 右 根。例1 如上圖...

前序中序出後序 二叉樹

描述 輸入一棵二叉樹的先序和中序遍歷序列,輸出其後序遍歷序列。輸入輸入檔案為tree.in,共兩行,第一行乙個字串,表示樹的先序遍歷,第二行乙個字串,表示樹的中序遍歷。樹的結點一律用小寫字母表示。輸出輸出檔案為tree.out,僅一行,表示樹的後序遍歷序列。樣例輸入 abdec dbeac 樣例輸出...

二叉樹的前序中序,中序後序建樹

tree creat1 int len,char s1,char s2 長度 s1起始點位址 s2起始點位址 a bdfghie c t data s1 0 fdhgibe a c t l creat1 i,s1 1,s2 s1 1將先序第乙個根節點空過去 t r creat1 len i 1,s1...