從0開始學算法7:樹形結構

一、基礎概念

1.定義

樹(Tree)是n(n≥0)個節點的有限集合T,它滿足兩個條件:有且僅有一個特定的稱爲根(Root)的節點;其餘的節點可以分爲m(m≥0)個互不相交的有限集合T1、T2、……、Tm,其中每一個集合又是一棵樹,並稱爲其根的子樹(Subtree)。

在這裏插入圖片描述

2.概念

  • 一個節點的子樹的個數稱爲該節點的度數,一棵樹的度數是指該樹中節點的最大度數。
  • 度數爲零的節點稱爲樹葉或終端節點,度數不爲零的節點稱爲分支節點,除根節點外的分支節點稱爲內部節點。
  • 一個節點的子樹之根節點稱爲該節點的子節點,該節點稱爲它們的父節點,同一節點的各個子節點之間稱爲兄弟節點。一棵樹的根節點沒有父節點,葉節點沒有子節點。
  • 一個節點系列k1,k2, ……,ki,ki+1, ……,kj,並滿足ki是ki+1的父節點,就稱爲一條從k1到kj的路徑,路徑的長度爲j-1,即路徑中的邊數。路徑中前面的節點是後面節點的祖先,後面節點是前面節點的子孫。
  • 節點的層數等於父節點的層數加一,根節點的層數定義爲一。樹中節點層數的最大值稱爲該樹的高度或深度。
  • m(m≥0)棵互不相交的樹的集合稱爲森林。樹去掉根節點就成爲森林,森林加上一個新的根節點就成爲樹。

在這裏插入圖片描述

二、二叉樹

1.定義

二叉樹(Binary Tree)是n(n≥0)個節點的有限集合,它或者是空集(n=0),或者是由一個根節點以及兩棵互不相交的、分別稱爲左子樹和右子樹的二叉樹組成。二叉樹與普通有序樹不同,二叉樹嚴格區分左孩子和右孩子,即使只有一個子節點也要區分左右。

在這裏插入圖片描述

2.二叉樹的遍歷

遍歷 :沿某條搜索路徑周遊二叉樹,對樹中的每一個節點訪問一次且僅訪問一次。

先序遍歷: 先訪問樹根,再訪問左子樹,最後訪問右子樹;
中序遍歷: 先訪問左子樹,再訪問樹根,最後訪問右子樹;
後序遍歷: 先訪問左子樹,再訪問右子樹,最後訪問樹根;
層次遍歷: 從根節點開始,逐層從左向右進行遍歷。

3.二叉樹的順序存儲

二叉樹本身是一種遞歸結構。但是如果二叉樹的結構比較稀疏的話浪費的空間是比較多的。

  • 空結點用None表示
  • 非空二叉樹用包含三個元素的列表[d,l,r]表示,其中d表示根結點,l,r左子樹和右子樹。
['A',['B',None,None
     ],
     ['C',['D',['F',None,None],
               ['G',None,None],
          ],     
          ['E',['H',None,None],
               ['I',None,None],
          ],
     ]
]

在這裏插入圖片描述

三、遞歸思想與實踐

1.什麼是遞歸

所謂遞歸函數是指一個函數的函數體中直接調用或間接調用了該函數自身的函數。這裏的直接調用是指一個函數的函數體中含有調用自身的語句,間接調用是指一個函數在函數體裏有調用了其它函數,而其它函數又反過來調用了該函數的情況。

2.遞歸函數調用的執行過程分爲兩個階段

遞推階段:從原問題出發,按遞歸公式遞推從未知到已知,最終達到遞歸終止條件。
迴歸階段:按遞歸終止條件求出結果,逆向逐步代入遞歸公式,迴歸到原問題求解。

3.優點和缺點

優點:遞歸可以把問題簡單化,讓思路更爲清晰,代碼更簡潔
缺點:遞歸因系統環境影響大,當遞歸深度太大時,可能會得到不可預知的結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章