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,一層一層的遍歷二叉樹的節點,一但遍歷到空節點,那麼不在往佇列裡加入...