1. 程式人生 > 實用技巧 >劍指17.樹的子結構

劍指17.樹的子結構

題目描述

輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)

分析

若樹B是樹A的子結構,則子結構的根節點可能為樹A的任意一個節點。因此,需要完成以下兩步操作:
  • 第一步:在樹A中找到和樹B的根節點的值一樣的節點 R (也就是樹A的遍歷);
  • 第二步:判斷樹A中以 R 為根節點的子樹是不是包含和樹B一樣的結構。
注意:與二叉樹相關的程式碼有大量的指標操作,每次訪問指標地址時要警惕這個指標有沒有可能是nullptr,如果是該如何處理?!

☆☆☆題解

/**
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 result = false; if(root1 != null && root2 != null){ if(root1.val == root2.val) result = DoesTree1HaveTree2(root1,root2); //如果找不到,依次遍歷左右孩子 if
(!result) result = HasSubtree(root1.left,root2); if(!result) result = HasSubtree(root1.right,root2); } return result; } public boolean DoesTree1HaveTree2(TreeNode root1,TreeNode root2){ //判斷的順序很重要,因為root1為null有兩種情況 if(root2 == null) //說明樹B已經遍歷完了都能對應的上 return
true; //注意root1為null有兩種情況,(1)root1==null&&root2!=null說明匹配失敗;(2)root1==null&&root2==null說明匹配成功。 if(root1 == null) //如果樹B還沒有遍歷完(root2!=null),樹A卻遍歷完了(root1==null),說明匹配失敗 return false; if(root1.val == root2.val){//根節點能對應上,再分別判斷左右孩子是否匹配 return DoesTree1HaveTree2(root1.left,root2.left) && DoesTree1HaveTree2(root1.right,root2.right); }else{ return false; } } }