5 樹的子結構

2022-04-27 11:03:09 字數 1126 閱讀 4170

0 引言

題目:輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構。二叉樹結點的定義如下:

struct

binarytreenode

;

1 抽象問題具體化

舉例1:

舉例2:a是任意樹,b為空樹,返回true;

舉例3:a是空樹,若b不是空樹,返回false,否則,返回true。

2 具體問題抽象化

語言描述演算法,並嘗試用偽**表述語言,一步一步達到可以執行的地步

1)輸入兩棵樹,a和b. 必須a和b同時不為空,才不返回false. 

if(!(proot1 != null && proot2 !=null))

return

false;

2)首先遍歷樹a,採用前序遞迴的遍歷方法,出迴圈表示遍歷完畢仍然沒有找到a中的子結構與b相同,返回false. 

bool hassubtree(treenode* proot1, treenode*proot2)
3)如果滿足當前結點值與b的根結點值相等,進入第二個遞迴遍歷。

bool doestree1hastree2(treenode* proot1, treenode*proot2)
3 demo

/*

** 遞迴判斷以proot1和proot2為根結點的兩棵樹是否具有相同的結構

* 輸入判斷:如果proot2為空,則兩棵樹具有相同的結構

* 如果proot2不為空,proot1為空,則兩棵樹必不具有相同的結構

* 如果兩棵樹根節點的值不相等,則兩棵樹必不具有相同的結構

* 遞迴:判斷兩個根節點的左子樹與右子樹是否具有相同的結構,必須同時具有相同的結構才可以輸出true

*/bool doestree1hastree2(treenode* proot1, treenode*proot2)

bool hassubtree(treenode* proot1, treenode*proot2)

// 返回查詢的結果

return

result;

}

4 **優化

思路1:想辦法把遞迴結構改成迭代結構

樹的子結構

題目 輸入兩顆二叉樹a和b 判斷b是不是a的子結構 二叉樹結點定義如下 首先 從樹根開始遍歷樹 如果結點與 b的根結點值相同 則繼續遍歷a的左子樹 以及b的左子樹 如果左子樹相同則遍歷a的右子樹以及b的左子樹 如果左右子樹都相同則 a包含b 如果結點與b的根節點值不同 則遍歷到a的左孩子 重複上述判...

樹的子結構

來自 劍指offer 的面試題18。題目 輸入兩棵二叉樹a和b,判斷b是不是a的子結構。二叉樹節點定義如下 public class treenode 思路分析 首先,在tree1中找到和tree2的根節點的值一樣的結點r 然後,再判斷tree1中以r為根結點的子樹是不是包含和tree2一樣的結構。...

樹的子結構

輸入兩顆二叉樹a,b,判斷b是不是a的子結構 思路 1 先判斷兩棵樹是否為空,是則沒有子樹 2 當兩棵樹為非空時,判斷當前的兩個根節點是否為子樹關係,若值相等,則繼續判斷左右子樹是否也對應相等 3 當根節點非子樹關係時,再判斷a樹的左右子樹和b樹是否有子樹。public class treenode...