此類題目考察對樹的遍歷(遞迴遍歷)
通過對二叉樹進行深度優先遍歷,遍歷到乙個節點,把此節點當作根節點來呼叫判斷函式,判斷以此節點為根節點,是否能匹配對應的鍊錶。
歸根結底,計算機大多數時間是通過暴力列舉的方法來解決問題的。
有兩道比較類似的題目如下:
leetcode 1367 二叉樹中的列表鏈結
題目描述:
給你一棵以 root 為根的二叉樹和乙個 head 為第乙個節點的鍊錶。
如果在二叉樹中,存在一條一直向下的路徑,且每個點的數值恰好一一對應以 head 為首的鍊錶中每個節點的值,那麼請你返回 true ,否則返回 false 。
一直向下的路徑的意思是:從樹中某個節點開始,一直連續向下的路徑。
函式介面:
bool issubpath(listnode* head, treenode* root)
1、當head為空,即鍊錶為空時,無論root是否為空,我們都可以返回true,因為空鍊錶可以和任意二叉樹匹配。
2、當root為空,即二叉樹為空,而head不為空,即鍊錶還有元素,則返回false,因為空二叉樹不能匹配非空鍊錶。
3、當兩者都不為空時,我們就可以從遍歷二叉樹中的節點,對於二叉樹中的每乙個節點,嘗試把它作為匹配的根節點,進行匹配判斷,如果匹配成功,返回true,直接結束,否則返回false。關於遍歷二叉樹,我們可以採用遞迴的思想,對當前節點的左右子節點,分別呼叫本函式。
4、匹配判斷單獨使用乙個函式
func(listnode* head, treenode* root)
此時問題就變成了從root開始向下遍歷,是否能和head向下遍歷匹配,又是遍歷。此時:
如果head為空,則返回true;
如果root為空,且head不為空,返回false;
如果兩者都不為空,但是兩者不相等,返回false;
否則,採用遞迴繼續深度遍歷。
答案:
/**
* definition for singly-linked list.
* struct listnode
* };
*//**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
bool
dfs(listnode* head, treenode* root)
};
leetcode 檢查子樹 鏈結
題目描述:
檢查子樹。你有兩棵非常大的二叉樹:t1,有幾萬個節點;t2,有幾萬個節點。設計乙個演算法,判斷 t2 是否為 t1 的子樹。
如果 t1 有這麼乙個節點 n,其子樹與 t2 一模一樣,則 t2 為 t1 的子樹,也就是說,從節點 n 處把樹砍斷,得到的樹與 t2 完全相同。
思路同上
答案:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
bool
dfs(treenode* t1, treenode* t2)
};
力扣1367 二叉樹中的列表
題目 給你一棵以 root 為根的二叉樹和乙個 head 為第乙個節點的鍊錶。如果在二叉樹中,存在一條一直向下的路徑,且每個點的數值恰好一一對應以 head 為首的鍊錶中每個節點的值,那麼請你返回 true 否則返回 false 一直向下的路徑的意思是 從樹中某個節點開始,一直連續向下的路徑。示例 ...
1367 二叉樹中的列表
題目描述 給你一棵以 root 為根的二叉樹和乙個 head 為第乙個節點的鍊錶。如果在二叉樹中,存在一條一直向下的路徑,且每個點的數值恰好一一對應以 head 為首的鍊錶中每個節點的值,那麼請你返回 true 否則返回 false 一直向下的路徑的意思是 從樹中某個節點開始,一直連續向下的路徑。示...
1367 二叉樹中的列表C
二叉樹資料結構如下 definition of binary tree node struct treenode 本題需要注意一點是子節點的匹配結果是受到父節點匹配結果影響的。分為兩種情況 父節點匹配成功 父節點匹配失敗 父節點匹配成功的情況 tree空 tree不空 list空 true true...