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

2021-07-11 10:15:25 字數 2492 閱讀 6766

二叉樹相關演算法是筆試面試常考內容,需重點掌握。

二叉樹節點定義:

public class treenode 

}

常見二叉樹筆試題如下

1、二叉樹序列化:將二叉樹轉換成string,空節點用特殊字元代替,一般用『#』表示,而且string是按每層依次編號,即層次遍歷。因為層次遍歷的方法也有很多,所以序列化方法也很多,這裡採用遞迴,非遞迴見4。

二叉樹 :3        ,序列化結果為。

/    \

9    20

/    \

15    7

上面的例子在程式中表示:

treenode root = new treenode(3);

root.left = new treenode(9);

root.right = new treenode(20);

root.right.left = new treenode(15);

root.right.right = new treenode(7);

system.out.println(serialize(root));

序列化程式:

private static stringbuffer sbur = new stringbuffer("");

public static string serialize(treenode root)

//刪除末尾的空格和逗號

i = sbur.length()-1;

while(sbur.charat(i)==','||sbur.charat(i)=='#')

return sbur.tostring();

} //根節點為root的二叉樹第level行(從0開始)

private static int nodeatlevel(treenode root, int level)else if(level==0)else

}

筆試時也可以採用前序、中序、後序遍歷進行序列化,更加簡單。

部落格就是採用的先序遍歷。

2、二叉樹反序列化:由string重構二叉樹,這裡string是按每層依次編號。

二叉樹第k行有2^(k-1)個節點(k從1開始),前

k行共有

2^k-1個節點,第k行的第乙個元素索引為

2^(k-1);

索引為2^(k-1)至2^(k-1)+

2^(k-2)-1

的節點在第k行左邊,索引為

2^(k-1)

+2^(k-2)至

2^k-1

的節點在

第k行右邊

;節點索引為n可推導出行號為k,它是該行第n-(2^(k-1)-1)個節點,與它同一行且位於它左邊的節點共有n-

2^(k-1)

個,這些節點在下一層共有2*n-2^k個子節點,則節點n的

左子樹節點是k+1行第2*n-

2^k+1個節點,右子

樹節點是k+1行第

2*n-

2^k+2個節點。

因此,節點n的

左子樹節點索引為2*n,右子樹節點索引為

2*n+1。

因此按層次遍歷序列化的二叉樹,可以按照索引規則進行反序列化。

public static treenode deserialize(string str)

} public static void midorder(treenode root)

} public static void postorder(treenode root)

6、判斷乙個樹是否為另一顆數的子樹

首先判斷節點值是否相同,相同則比較各個子節點是否相同,不同則遞迴判斷是否是左子樹或右子樹的子樹。

public static boolean issubtree(treenode root1, treenode root2)

public static boolean checknode(treenode root1, treenode root2)

7、求二叉樹的深度

遞迴演算法:二叉樹的深度 = max(左子樹的深度,右子樹的深度)+1。

public static int getdeep(treenode root)
8、

前序遍歷和中序遍歷結果重構二叉樹(不含重複數字)

前序遍歷陣列的第乙個元素必定是根節點root,在中序遍歷陣列中找到root,位於根節點左邊的一定屬於根節點左子樹,位於根節點右邊的一定屬於

根節點右子樹,然後遞迴左子樹、右子樹,將遞迴結果賦值給root.left和root.right。

public static treenode reconstructbinarytree(int  pre,int  in)

演算法學習 二叉樹

概念 樹中的元素叫做節點 連線相鄰的節點之間的關係叫父子關係 節點a節點是b節點的父節點,b節點是a節點的子節點。c,d單個節點的父節點是同乙個節點,所以他們互稱為兄弟節點 把沒有父節點的節點叫做根節點 沒有子節點的節點叫做葉子節點或者葉節點 樹節點的高度 節點到葉子節點的最長路徑 邊數 節點的深度...

演算法學習 平衡二叉樹

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

演算法學習 監控二叉樹

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