程式設計練習之一顆二叉樹包含另一顆二叉樹

2021-07-03 08:05:16 字數 773 閱讀 9662

劍指offer上的一道程式設計練習,如何確定二叉樹a包含一棵相對小一點的二叉樹b?

思路:用兩個函式實現,第乙個首先判斷根結點是否相等,第二個函式繼續判斷子結構是否相等

函式一:

第一步,首先從根結點入手,判斷proota的值是否與prootb的根結點的值是否相等。若相等,則在比較a樹的子結構是否包含b數子結構,此時轉入函式二;

若不相等 則轉入:

第二步,遞迴進入函式一,判斷proota的左子樹的值是否與prootb的根結點的值是否相等,若相等則轉入函式二;

若還不相等 則轉入:

第三步,遞迴進入函式一,判斷proota的右子樹的值是否與prootb的根結點的值是否相等,若相等則轉入函式二;

函式一**如下:

bool hassubtree(binarytreenode* proot1, binarytreenode* proot2)

}

最後。遞迴完成後,若左右子樹中的根結點都不相等,說明a樹不含有b樹。

函式二:

在根結點相等的基礎上,遞迴的判斷a樹的左右子樹的值是否與b數的左右子樹的值相等,

若是在prootb全部遍歷結束時,則說明a樹含有b樹,

若是在proota全部遍歷結束時,則說明a樹不含有b樹。

函式二**如下:

bool dosetree1hastree2(binarytreenode* proot1, binarytreenode* proot2)

判斷一顆二叉樹是是否是另一顆樹的子樹。

什麼樣的情況下,某一棵樹會成為另一棵樹的子數呢?子樹的根節點是某一棵樹的某個節點,接下來的子節點也相同,則該樹是另一棵樹的子集。首先找到與根節點相同的節點,在進行遍歷,可使用遞迴法。template struct treenode template bool check treenode root1...

另一顆樹的子樹

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的乙個子樹包括 s 的乙個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。解題思路 先從跟結點開始,看兩顆樹的根節點是否相同,然後遞迴遍歷兩棵樹的左右子樹,如果都相同返回true 否則讓樹s左右子樹...

驗證一顆二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。這裡有一種錯誤的思路 判斷當前節點大於左節點,小於右節點,以此遞迴下去,當不滿足上面條件就返回false...