很簡單,假如說判斷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 ...