二叉樹也是一種數據結構(廢話)。妥妥的樹形結構,沒有聽過樹形結構?太晦澀?樹必定都見過編程
主幹分叉,分叉再分叉。。。。最後不分了,就開始長出葉子。這就是樹。
二叉樹結構橫空出世。
區別就是,每次只能分兩個子節點,因此叫二叉樹。分多個,也是樹,就不能稱爲二叉樹了,小科普。
舉個典型的例子,編程中,省、市、區縣、街道的數據組成,分兩個叉?一個省只有兩個市?一個市只有兩個區縣?這就不屬於二叉樹的範疇了。markdown
咱們給二叉樹加上數字標記位置
根節點從1開始,從上到下,從左到右來標記位置數據結構
二叉樹只有這一種形態?
滿二叉樹、徹底二叉樹、不徹底二叉樹
好像不滿?但他也是二叉樹,叫
徹底二叉樹
- 每一層都是從左到右,相鄰節點是連續的
- 而且最後一層以上的全部層,均是滿的,爲徹底二叉樹,以下圖
- 滿二叉樹也是徹底二叉樹!
什麼是不徹底二叉樹?
- 同一層從左到右出現缺失,不連續
- 或者最後一層以上的全部層,也有缺失
找規律
深度、層、高度、度
補充一個小概念:度?某個節點的度,就是該節點擁有子節點的數量。上圖,節點[1]的度=2, 節點[2]的度=2,節點[8]、節點[9]到節點[15]的度爲0.
咱們從上圖能夠發現spa
- 在第i層上,有
個節點
- 最大深度爲k時,整個二叉樹最多有 2k-1 個節點
- 終端節點數 = 度爲2的節點數+1;(終端節點就是葉子節點,度爲0的節點)
- 有n個節點徹底二叉樹,深度 =

- 有n個節點的徹底二叉樹,從根節點開始標號,標號i從1開始,如上面的徹底二叉樹,那麼
- i>1,i節點的雙親節點爲i/2;
- 若是i=1,那麼序號爲i的結點爲根節點,無雙親結點
- 若是2i<=n,那麼序號爲i的結點的左孩子結點序號爲2i
- 若是2i>n,那麼序號爲i的結點無左孩子
- 若是2i+1<=n,那麼序號爲i的結點右孩子序號爲2i+1
- 若是2i+1>n,那麼序號爲i的結點無右孩子
二叉樹的遍歷
有這麼一個二叉樹code
咱們有幾種方式來遍歷呢?orm
前序遍歷
規則: 若二叉樹爲空,則空操做返回; 不然先訪問根結點,而後前序遍歷左子樹,再前序遍歷右子樹it
A -> B -> D -> G -> H -> C -> E -> I -> F
中序遍歷
規則: 若二叉樹爲空,則空操做返回; 不然從根結點開始(注意並非先訪問根結點), 中序遍歷根結點的左⼦樹,而後是訪問根結點,最後中序遍歷右子樹.io
G->D->H->B->A->E->I->C->F
後序遍歷
規則: 若二叉樹爲空,則空操做返回; 不然從左到右先葉子後結點的⽅式遍歷左右⼦樹,最後訪問根結點table
G->H->D->B->I->E->F->C->A
層序遍歷
從上到下,從左到右 A B C D E F G H Iclass