判斷一棵樹是不是另一顆樹的子樹
首先可以先判斷根節點是否相同,找到根節點相同的之後,再判斷其左右子樹是否相同。
當出現a樹有某子節點,b樹沒有的時候,也有可能是true。
反之不行
public class solution
if(root1.val == root2.val && iscontain(root1,root2))
return hassubtree(root1.left,root2) || hassubtree(root1.right,root2);
}public boolean iscontain(treenode node1,treenode node2)
if(node2 == null)
return node1.val == node2.val && iscontain(node1.left,node2.left) &&iscontain(node1.right,node2.right);
}}
第二種方法:
首先先把兩棵樹進行序列化,化成字串的形式(注意空子樹要填#)
然後問題就轉換成了求子串的問題。
用kmp演算法來解這個問題。
時間複雜度比較小
public boolean hassubtree(treenode root1,treenode root2)
//樹的序列化
public static string serial(treenode head)
string res = head.val+"";
res += serial(head.left);
res += serial(head.right);
return res;
}//準備用kmp演算法判斷乙個是否是另乙個的子串
//先弄出next陣列
public static int getnextarray(char ms);
}int nextarr = new int[ms.length];
nextarr[0]=-1;
nextarr[1]=0;
int right = 2;
int left = 0;
while(right0)else
}return nextarr;
}//判斷兩個string是否是子串
public static boolean getindexof(string s, string m)
char ss = s.tochararray();
char ms = m.tochararray();
int nextarr = getnextarray(ms);
int index = 0;
int mi = 0;
while (index < ss.length && mi < ms.length) else if (nextarr[mi] == -1) else
}return mi == ms.length;
}}在這裡插入**片
劍指Offer16翻轉鍊錶
題目 定義乙個函式,輸入乙個鍊錶的頭結點,翻轉該鍊錶並輸出翻轉後鍊錶的頭結點。分析 這個題剛看的時候可能會和之前遇到的逆序輸出鍊錶差不多,不過在那個題目中並沒有改變鍊錶的指標,而是通過增加空間來進行逆序輸出的,還記得怎麼做嗎?當然就是增加乙個n長度的棧。當然如果題目要求中是可以改變鍊錶的,並且只允許...
劍指Offer 16 翻轉鍊錶
題目 定義乙個函式,輸入乙個鍊錶的頭結點,翻轉該鍊錶並輸出翻轉後的鍊錶。思路 1.使用兩個指標a,b分別指向待翻轉的兩個結點,同時為了防止斷鏈,使用乙個指標c儲存b next指標,c b next。2.a,b兩個結點翻轉後,令a b,b c。3.迴圈1,2直至b為null。注意 1.頭結點的next...
劍指offer 16 反轉鍊錶
class listnode 題目 鍊錶翻轉 解法 設立三個標誌直接進行翻轉 public class main public static listnode reverselist listnode node listnode pre null 前序結點先設定為空 listnode point n...