二叉樹相關演算法是筆試面試常考內容,需重點掌握。
二叉樹節點定義:
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,那麼它就是一棵平衡二叉樹。看到題目,第一時間看到二叉樹的深度定義為 從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。具體可以去看二叉樹的深度 當學會了如何求...
演算法學習 監控二叉樹
給定乙個二叉樹,我們在樹的節點上安裝攝像頭。節點上的每個攝影頭都可以監視其父物件 自身及其直接子物件。計算監控樹的所有節點所需的最小攝像頭數量。從題目中知道,我們需要求得最小攝像頭數量 那麼怎麼樣去保證最小呢 我們來用乙個節點的不需安裝攝像頭的情況列舉一下 當此節點的左右子節點,乙個節點為已監視狀態...