劍指offer16 樹的子結構

2021-10-03 19:14:22 字數 1546 閱讀 1656

判斷一棵樹是不是另一顆樹的子樹

首先可以先判斷根節點是否相同,找到根節點相同的之後,再判斷其左右子樹是否相同。

當出現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...