如何判斷一棵樹是不是另一棵樹的子樹

2021-09-02 17:55:47 字數 2100 閱讀 6141

package suanfatest;

class treenode

treenode(int value)

treenode(int value,treenode leftchild,treenode rightchild)

public int getvalue()

public void setvalue(int value)

public treenode getleftchild()

public treenode getrightchild()

public void setleftchild(treenode leftchild)

public void setrightchild(treenode rightchild)

}public class treechild

return result;

}// 比較以得到的和子樹根節點相同的節點的子樹和原始子樹,若相同則返回true,否則返回false

static boolean compareparentandchildtree(treenode parentroot, treenode childroot) else

return compareparentandchildtree(parentroot.getleftchild(), childroot.getleftchild()) == true&& compareparentandchildtree(parentroot.getrightchild(), childroot.getrightchild()) == true;

}//static boolean childtree

public static void main(string args)

}

結果為true;

分析:首先考慮小資料量的情況,可以根據樹的前序和中序遍歷所得的字串,來通過判斷t2生成的字串是否是t1字串的子串,來判斷t2是否是t1的子樹。假設t1的節點數為n,t2的節點數為m。遍歷兩棵樹演算法時間複雜性是o(n + m), 判斷字串是否為另乙個字串的子串的複雜性也是o( n + m)(比如使用kmp演算法)。所需要的空間也是o(n + m)。

這裡有乙個問題需要注意:對於左節點或者右節點為null的情況,需要在字串中插入特殊字元表示。否則對於下面這種情形將會判斷錯誤:

因此如果插入特殊字元,上述兩棵樹的中序和前序遍歷的結果是相同的。

由於本例有幾百萬的節點,需要占用o(n + m)的記憶體。

如果換一種思路,就是遍歷t1,每當t1的某個節點與t2的根節點值相同時,就判斷兩棵子樹是否相同。這個演算法的複雜度是o(n*m)。我們再仔細思考一下。因為只有在節點值與t2的根節點值相同才會呼叫o(m)。假設有k次這種情況,那麼演算法的複雜度就是o(n + k*m)。

struct treenode;  

// check sub tree n1 == sub tree n2

bool checksubtree(const treenode* n1, const treenode* n2)

bool subtree(const treenode *n1, const treenode *n2)

if( n1->data == n2->data)

return subtree(n1->leftchild, n2) || subtree(n2->rightchild, n2);

}

對於上面討論的2種解法,哪種解法比較好呢?其實有必要好好討論一番:

1)方法一會占用o(n + m)的記憶體,而另外一種解法只會占用o(logn + logm)的記憶體(遞迴的棧記憶體)。當考慮scalability擴充套件性時,記憶體使用的多寡是個很重要的因素。

2)方法一的時間複雜度為o(n + m),方法二最差的時間複雜度是o(n*m)。所以要通過工程實踐或者是歷史資料看一下哪種方法更優。當然了,方法二也可能會很早發現兩棵樹的不同,早早的退出了checksubtree。

總的來說,在空間使用上,方法二更好。在時間上,需要通過實際資料來驗證。

一棵樹是否為另一棵樹的子結構

輸入兩顆二叉樹a,b,判斷b是不是a的子結構。問題描述 給定兩個二叉樹的根節點,判斷第二樹是否是第乙個樹的子樹,如果是返回1,否則返回0.拿第二個樹的每個節點去和第乙個樹做匹配,如果某個節點匹配成功,就接著往下匹配,否則重新從第二個樹的的根節點開始。注意區別 測試用例 樹1 42 6 1 3 5 7...

判斷一棵樹是否是另一棵樹的子樹 java實現

這是乙個很經典的演算法題,聽起來好像挺難的,但是其實很簡單。我覺得我們接觸到的問題,並沒有難題,只有複雜不複雜。乙個再難的問題,也可以分解成乙個個簡單的問題,再將這些簡單的問題交給不同的人去做就構成了乙個專案。其實寫演算法也是這個思想。首先要判斷一棵樹是不是另一棵樹的子樹,我們只需遍歷一棵樹,用這個...

另一棵樹的子樹

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的乙個子樹包括 s 的乙個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。示例 1 給定的樹 s 3 4 5 1 2 給定的樹 t 4 1 2 返回 true,因為 t 與 s 的乙個子樹擁有相同的...