【劍指Offer】二叉樹——子樹匹配

package cn.dzp.flyroc.offer;


public class HasSubTreeDemo {

        /* 題目描述:輸入兩顆二叉樹A,B。
        判斷B是否是A的子結構。(約定空樹不是任何一個樹的子結構)*/

        /* 思路:若根節點相同,利用遞歸比較他們的子樹是否相同;
        若根節點不一樣,則利用遞歸分別在左右子樹中查找。*/


        //代碼實現
     static class TreeNode {       //構建TreeNode類

            int val;    //節點值
            TreeNode left;      //構建左子樹
            TreeNode right;     //構建右子樹

            //構造函數
            TreeNode(int val) {

                this.val = val;
            }
        }

        //判斷A,B兩樹的根節點是否相同
    public  boolean rootEquire(TreeNode rootA, TreeNode rootB){

         //定義一個初始標記
        boolean result = false;

        //判斷A,B兩樹是否爲空
        if (rootA != null && rootB != null){

            //判斷A,B兩樹的根節點值是否相等
            if (rootA.val == rootB.val){

                //以A樹的根節點爲起點,與B樹一一比較
                result = nodeEquire(rootA,rootB);
            }

            //若是A,B兩樹的根節點不一樣,就去A樹的左右子樹找是否有與B樹相同的結構
            if (!result){

                return rootEquire(rootA.left ,rootB) || rootEquire(rootA.left ,rootB);
            }
        }
        System.out.println("B樹不是A樹的子樹");
        return result;
    }

    //判斷A,B兩樹的子樹是否相同
    public static boolean nodeEquire(TreeNode nodeA, TreeNode nodeB) {

         //treeB全度遍歷完了,且一一對應
        if (nodeB == null){

            System.out.println("B數是A數的子樹");
            return true;
        }


        //treeA全都遍歷完,treeB還沒遍歷完
        if (nodeA == null){

            System.out.println("B樹不是A樹的子樹");
            return false;
        }

        //若是某處的節點值不一樣
        if (nodeA.val != nodeB.val){

            System.out.println("B樹不是A樹的子樹");
            return false;
        }

        //若是根節點對應上,就去子樹中匹配
        return nodeEquire(nodeA.left,nodeB.left) && nodeEquire(nodeA.right, nodeB.right);
    }
}
相關文章
相關標籤/搜索