演算法學習 二叉樹

2022-08-31 21:57:21 字數 1548 閱讀 5729

概念

樹中的元素叫做節點

連線相鄰的節點之間的關係叫父子關係

節點a節點是b節點的父節點,b節點是a節點的子節點。

c,d單個節點的父節點是同乙個節點,所以他們互稱為兄弟節點

把沒有父節點的節點叫做根節點

沒有子節點的節點叫做葉子節點或者葉節點

樹節點的高度:節點到葉子節點的最長路徑(邊數)

節點的深度:根節點到這個節點所經歷的邊的個數

節點的層數:節點的深度+1

樹的高度:根節點的高度

高度:從下往上度量,葉子節點的高度為0

深度:從上往下度量,根節點的深度為0

層數:和深度類似,計數起點是1

二叉樹

編號為2的二叉樹,葉子結點都在最底層,除了葉子節點之外,每個節點都有左右兩個子節點,這種二叉樹叫做滿二叉樹

標號3的二叉樹中,葉子節點都在最底下兩層,最後一層的葉子節點都靠在左排列,並且除了最後一層,其它層的節點數都要達到最大,這種二叉樹叫做完全二叉樹

儲存二叉樹的遍歷

遍歷分為三種方式:前序遍歷中序遍歷後序遍歷

前,中,後表示節點在它的左右子樹節點遍歷列印的先後順序。

前中後序遍歷是一種遞迴的過程。

前序遍歷,其實就是先列印根節點,然後再遞迴地 列印左子樹,左後遞迴列印右子樹

遞推公式的關鍵就是,如果要解決問題a,就假設子問題b,c已經解決,然後再看如何利用b,c解決a,

//前序遍歷的遞推公式:

preorder(r) = print r->preorder(r->left)->preorder(r->right);

//中序遍歷的遞推公式:

inorder(r) = inorder(r->left)->print r->inorder(r->right);

//後序遍歷的遞推公式:

postorder(r) = postorder(r->left)->postorder(r->right)->print r;

void preorder(node* root) 

void inorder(node* root)

void postorder(node* root)

二叉樹遍歷的時間複雜度:

每個節點最多被訪問兩次,時間複雜度和節點的個數n成正比,為o(n)

演算法學習 平衡二叉樹

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。看到題目,第一時間看到二叉樹的深度定義為 從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。具體可以去看二叉樹的深度 當學會了如何求...

演算法學習 監控二叉樹

給定乙個二叉樹,我們在樹的節點上安裝攝像頭。節點上的每個攝影頭都可以監視其父物件 自身及其直接子物件。計算監控樹的所有節點所需的最小攝像頭數量。從題目中知道,我們需要求得最小攝像頭數量 那麼怎麼樣去保證最小呢 我們來用乙個節點的不需安裝攝像頭的情況列舉一下 當此節點的左右子節點,乙個節點為已監視狀態...

演算法學習 8 二叉樹相關演算法

二叉樹相關演算法是筆試面試常考內容,需重點掌握。二叉樹節點定義 public class treenode 常見二叉樹筆試題如下 1 二叉樹序列化 將二叉樹轉換成string,空節點用特殊字元代替,一般用 表示,而且string是按每層依次編號,即層次遍歷。因為層次遍歷的方法也有很多,所以序列化方法...