思路其實比較簡單,採用遞迴來處理,採用兩個容器來儲存兩個節點的所有子節點,然後逐個去遞迴比較。但是難點在於不考慮子樹的順序!
筆者第一次,想先排序(比如使用優先佇列),把演算法複雜度到max(o(mlogm,nlogn)).但是發現有可能兩棵子樹的根的值相等,但是下面的部分卻不相等,此時比較會出出錯。所以必須逐個比較,並把比較過確實相等的去重。
還有一點需要注意的是,如果採用對樹中的每一棵子樹,都試圖從中找是否有相等的子樹,若所有的都能找到則兩個集合相等。這樣也不正確,因為可能是集合1術語集合2.所以我們還要先比較下集合的大小。
演算法最壞的情況下每個子樹對都需要比較一次,即任意都需要比較一次,複雜度為o(mn)。using namespace std;
bool equaltree(treenode *rt1, treenode* rt2)
if(rt.isleaf() && r2.isleaf())
return
true; //達到葉節點,不再遞迴直接返回
listl1,l2;
treenode * pointer1 = rt1,pointer2=rt2;
while(pointer1!=null)
while(pointer2!=null)
if(l1.size() != l2.size()) //防止出現子集相等
return
false;
list::iterator it1, it2; // 子節點列表的迭代器
for(it1=l1.begin();it1for(it2=l2.begin();it2if(equaltree(*it1,*it2))
}if(it2 == l2.end())
return
false;
}return
true;
}複製**
判斷兩顆二叉樹是否是相同的樹
題目描述 給定兩個二叉樹,編寫乙個函式來檢驗它們是否相同 如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的 先考慮空樹的情況 如果兩個樹都為空,那麼這兩棵樹肯定是相同的 如果其中任意一棵樹為空,兩棵樹肯定不相同 當且僅當兩棵樹的根 左子樹 右子樹都相同,這兩棵樹才相同 class s...
判斷兩顆二叉樹是否相似的兩種方法
名稱 判斷兩個二叉樹是否相似 說明 此處的兩個方法乙個是非遞迴,乙個是遞迴演算法。其實兩個演算法的本質思路是一樣的就是,判斷位置相同的兩www.cppcns.com個結點是否同時為空或同時不為空。只是具體的實現不一樣。對於層次遍曆法 此處不小心用錯了,本應該用佇列來當作排列下一層元素的。歪打正著,此...
輸入兩顆二叉樹A,B,判斷B是不是A的子結構
方法一 最簡單就是首先判斷兩棵樹的根節點是否相同,如果相同則判斷兩顆樹的左節點是否對應,右結點是否對應,如果兩個根節點值不同,主樹左節點與子樹根節點判斷,主樹右結點與子樹根節點判斷,然後再判斷對應節點是否相同即可 複雜度 o m n 方法二 首先兩棵樹序列化為字串,然後就是判斷字串之間的包含問題了,...