C 判斷兩顆樹在不考慮子樹順序的前提下是否相等

2021-09-12 01:41:28 字數 934 閱讀 8528

思路其實比較簡單,採用遞迴來處理,採用兩個容器來儲存兩個節點的所有子節點,然後逐個去遞迴比較。但是難點在於不考慮子樹的順序!

筆者第一次,想先排序(比如使用優先佇列),把演算法複雜度到max(o(mlogm,nlogn)).但是發現有可能兩棵子樹的根的值相等,但是下面的部分卻不相等,此時比較會出出錯。所以必須逐個比較,並把比較過確實相等的去重。

還有一點需要注意的是,如果採用對樹中的每一棵子樹,都試圖從中找是否有相等的子樹,若所有的都能找到則兩個集合相等。這樣也不正確,因為可能是集合1術語集合2.所以我們還要先比較下集合的大小。

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;

}複製**

演算法最壞的情況下每個子樹對都需要比較一次,即任意都需要比較一次,複雜度為o(mn)。

判斷兩顆二叉樹是否是相同的樹

題目描述 給定兩個二叉樹,編寫乙個函式來檢驗它們是否相同 如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的 先考慮空樹的情況 如果兩個樹都為空,那麼這兩棵樹肯定是相同的 如果其中任意一棵樹為空,兩棵樹肯定不相同 當且僅當兩棵樹的根 左子樹 右子樹都相同,這兩棵樹才相同 class s...

判斷兩顆二叉樹是否相似的兩種方法

名稱 判斷兩個二叉樹是否相似 說明 此處的兩個方法乙個是非遞迴,乙個是遞迴演算法。其實兩個演算法的本質思路是一樣的就是,判斷位置相同的兩www.cppcns.com個結點是否同時為空或同時不為空。只是具體的實現不一樣。對於層次遍曆法 此處不小心用錯了,本應該用佇列來當作排列下一層元素的。歪打正著,此...

輸入兩顆二叉樹A,B,判斷B是不是A的子結構

方法一 最簡單就是首先判斷兩棵樹的根節點是否相同,如果相同則判斷兩顆樹的左節點是否對應,右結點是否對應,如果兩個根節點值不同,主樹左節點與子樹根節點判斷,主樹右結點與子樹根節點判斷,然後再判斷對應節點是否相同即可 複雜度 o m n 方法二 首先兩棵樹序列化為字串,然後就是判斷字串之間的包含問題了,...