劍指offer-17:樹的子結構
題目描述
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
解題思路
- 從根節點開始,判斷值是否相同
- 如果不同則分別用A樹的左右孩子節點與B樹的根節點比較
- 沒有則直接返回
- 如果找到值相同的,則呼叫輔助方法遞迴判斷A樹的左右孩子和B樹的左右孩子是否相等
- 直到B樹為空,則返回true,否則回溯,繼續尋找A樹的與B跟節點值相同的孩子
- 直到A樹為空,則返回false
- 注意邊界判斷。空樹不是任意一個樹的子結構
程式碼實現
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean res = false;
if (root1 == null || root2 == null) {
return false;
}
if (root1.val == root2.val) {
res = HasSubTreeHelp(root1, root2);
}
if (!res) {
res = HasSubTreeHelp(root1.left, root2);
}
if (!res) {
res = HasSubTreeHelp(root1.right, root2);
}
return res;
}
public boolean HasSubTreeHelp (TreeNode root1,TreeNode root2) {
if (root2 == null) return true;
if (root1 == null) return false;
if (root1.val == root2.val){
return HasSubTreeHelp(root1.left, root2.left)
&& HasSubTreeHelp(root1.right, root2.right);
}
return false;
}
}
相關文章
- 【劍指offer】樹的子結構
- 劍指offer面試18 樹的子結構面試
- 二叉樹的子樹和子結構 c++二叉樹C++
- 二叉樹的子結構二叉樹
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- JZ-017-樹的子結構
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 指標體系與樹型結構指標
- 劍指offer(四)重建二叉樹二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 【劍指offer】連續子陣列的最大和陣列
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- 檢驗一顆樹是不是另一顆樹的子結構
- 反轉連結串列、合併連結串列、樹的子結構
- JS資料結構與演算法 - 劍指offer二叉樹演算法題彙總JS資料結構演算法二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 劍指office--31. 連續子陣列的最大和陣列
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 劍指 Offer 48. 最長不含重複字元的子字串字元字串