二叉樹——初探

二叉樹也是一種數據結構(廢話)。妥妥的樹形結構,沒有聽過樹形結構?太晦澀?樹必定都見過編程

主幹分叉,分叉再分叉。。。。最後不分了,就開始長出葉子。這就是樹。

二叉樹結構橫空出世。

區別就是,每次只能分兩個子節點,因此叫二叉樹。分多個,也是樹,就不能稱爲二叉樹了,小科普。
舉個典型的例子,編程中,省、市、區縣、街道的數據組成,分兩個叉?一個省只有兩個市?一個市只有兩個區縣?這就不屬於二叉樹的範疇了。markdown

咱們給二叉樹加上數字標記位置

根節點從1開始,從上到下,從左到右來標記位置數據結構

二叉樹只有這一種形態?

滿二叉樹、徹底二叉樹、不徹底二叉樹

好像不滿?但他也是二叉樹,叫 徹底二叉樹

  • 每一層都是從左到右,相鄰節點是連續的
  • 而且最後一層以上的全部層,均是滿的,爲徹底二叉樹,以下圖
  • 滿二叉樹也是徹底二叉樹!

什麼是不徹底二叉樹?

  • 同一層從左到右出現缺失,不連續
  • 或者最後一層以上的全部層,也有缺失

找規律

深度、層、高度、度

補充一個小概念:度?某個節點的度,就是該節點擁有子節點的數量。上圖,節點[1]的度=2, 節點[2]的度=2,節點[8]、節點[9]到節點[15]的度爲0.

咱們從上圖能夠發現spa

  • 在第i層上,有 2^{i-1} 個節點
  • 最大深度爲k時,整個二叉樹最多有 2k-1 個節點
  • 終端節點數 = 度爲2的節點數+1;(終端節點就是葉子節點,度爲0的節點)
  • 有n個節點徹底二叉樹,深度 = \log_2n+ 1
  • 有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

相關文章
相關標籤/搜索