概念
樹中的元素叫做節點
連線相鄰的節點之間的關係叫父子關係
節點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是按每層依次編號,即層次遍歷。因為層次遍歷的方法也有很多,所以序列化方法...