判斷乙個樹是否是另外乙個樹的子樹

2021-07-10 00:15:09 字數 1268 閱讀 2691

很簡單,假如說判斷b是否為a的乙個子樹,則首先對a進行遍歷,然後如果遍歷時候節點的值等於b的根節點,則進入判斷函式進行判斷,如果完全一樣,則該函式返回true,否則返回false,在後面遞迴判斷時候,要判斷前面函式返回的是true還是false,如果是true,則它的子樹就不用再判斷了,直接返回那個bool值,如果是false,則要對後面的左右子樹依舊進行判斷。

接下來討論那個比較兩棵樹的函式,我們可以看到,如果假設b是a的子集,且設定兩個指標,分別指向其兩個樹的根節點,二者同時開始進行遍歷,可以看到有以下幾種情況

a            b  代號    bool值

有         空   甲          true

有         有   乙          看值是否相等來判斷

空        空    丙          true

空        有    丁         false

空,就是遍歷時候,當前節點為空,有意思就是,相反,當前節點不為空

上面這四種情況的目的在於如何讓程式判斷遞迴截止

對於乙情況,不用考慮,我們只考慮邊界情況

甲丙丁三種情況,可以看到,在b為空時候,boo值為true,也就是說,b為a的

#include using namespace std;

typedef struct _bitree

bitree,* pbitree;

pbitree buildtree()

void print(pbitree p)

bool sametree(pbitree p1,pbitree p2)

bool judgetree(pbitree p1,pbitree p2)

int main()

{ pbitree p1;

pbitree p2;

p1=buildtree();

print(p1);

p2=buildtree();

print(p2);

if(judgetree)

cout<<"2 is 1's subtree"<

而a為空且b為有的時候,才為false

if(a==null&&b!=null)

return false

if(b==null)

return true;

可以發現,上述**可以優化為

if(b==null)

return true;

if(a==null)

return false

**如下

判斷乙個序列是否是另外乙個序列的子串行的演算法

思路一 從子串行中挨個找,找到乙個之後,擷取子串行和母序列之前的,然後繼續遞迴自身 1.先分析下找不到的情況,如果母序列從頭找到尾,也沒有找到,則視為不是其子序列 2.繼續分析找到的情況,如果找到之後,並且子串行的長度為1,則代表都找完了。3.如果這時子串行仍然還沒有找完,則擷取後繼續呼叫自身。pu...

判斷乙個樹是否對稱

使用遞迴的方法判斷樹是否對稱,也讓我更進一步的理解了遞迴。class solution object def ismirror self,left,right if left none and right none 如果左右子樹都為空,則對稱 return true elif left none o...

判斷乙個節點是否是另乙個元素的子節點

判斷乙個元素是否包含乙個指定節點這個函式時在contains 的基礎上封裝的,contains 不相容火狐,特意封裝了一下,以後方便用。function isdomcontains parentele,ele,container if ele ele.nodetype ele.nodetype 1 ...