判斷一顆二叉樹是不是另一棵二叉樹的子結構

2021-05-27 18:57:24 字數 1313 閱讀 4776

1、題目描述:

如何判斷乙個二叉樹是否是另乙個的子結構?

比如:

2

/   \

9    8

/ \    /

2  3  5

/6

有個子結構是

9/ \

2  3

2、

分析問題:

有關二叉樹的演算法問題,一般都可以通過遞迴來解決。那麼寫成乙個正確的遞迴程式,首先一定要分析正確遞迴結束的條件。

拿這道題來講,什麼時候遞迴結束。

<1>第二個二叉樹root2為空時,說明root2是第一棵二叉樹的root1的子結構,返回true。

<2>當root1為空時,此時root2還沒為空,說明root2不是root1的子結構,返回false。

<3>遞迴下面有兩種思路:

方法一:現在root1中找結點值與root2的值相等的結點,如果找到就判斷root2是不是這個結點開頭的子結構。所以,首先issubtree()判斷。

方法二:就是直接判斷,相同就遞迴判斷root2左右子樹是不是也是相應的子結構。如果值不相同,就分別遞迴到root1的左右子樹尋找。尤其要注意最後兩句遞迴的邏輯判斷。

3、**:

方法一:

//判斷root2是不是root1開頭的子結構

boolissubtree(bitreenode *root1,bitreenode *root2)

//遞迴查詢以root1為節點的樹中,是否有和root2相同的值,如果有,則呼叫issubtree(root1, root2);

boolcheckifsubtree(bitreenode *root1,bitreenode *root2)

方法二:

//一次遞迴完成

boolcheckifsubtree2(bitreenode *root1,bitreenode *root2) ;

void createbitree(bitreenode* &root)

else}

5、小結

一定要好好的體會遞迴,尤其是遞迴結束的情況。這是解大多數遞迴問題的關鍵。

判斷一棵二叉樹是不是另一棵二叉樹的子樹

定義 父樹包含子樹的所有節點,注意,空樹不是任何數的子樹。父樹 a 子樹 b 解法 用遞迴來實現,從a樹的根節點開始,判斷其所有的節點是不是依次和樹b相同,如不同,遞迴呼叫函式,繼續判斷樹a當前節點的左子樹的所有節點或右子樹的所有節點是否和樹b所有節點相同,直到遍歷到父樹a的葉子節點,如果不是完全相...

判斷一顆二叉樹是不是完全二叉樹

類似於測序遍歷,用佇列實現 先進後出 1 如果根不為空,那麼根入隊 2 判斷佇列是否為空,不為空,則將隊頭元素出隊並儲存在臨時變數cur裡,3 判斷cur是否為空,若不為空,則將cur的左右子樹都放到佇列裡,如果子樹為空,就往佇列裡插入null。若為空,則直接停止出隊,然後看佇列裡是否還有不是nul...

判斷一顆二叉樹是不是完全二叉樹

還有一種特殊的完全二叉樹就是葉子節點都在同一層的,如下圖 完全二叉樹定義,若設二叉樹的深度為h,除第 h 層外,其它各層 1 h 1 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。思路是 用bfs,一層一層的遍歷二叉樹的節點,一但遍歷到空節點,那麼不在往佇列裡加入...