最近複習題中看到二叉樹,對於它的前序,中序,後序遍歷的判斷有些模糊,後經查閱資料,將學習過程記錄在部落格中。
對一棵二叉樹進行遍歷,我們可以採取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...