劍指offer-js 樹的子結構

樹的子結構

題目描述:

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

問題分析:

判斷B是不是A的子樹,那麼就必須有兩個操作,
	遍歷A子樹找對應的根結點,
	遍歷B結點比較A樹的子結構是否和B樹相同

通過遞歸完成B樹節點的逐個比較,return 結果

代碼展示:

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */

function HasSubtree(pRoot1, pRoot2)
{
    // 1,在樹A中找到和樹B一樣的節點R
    // 2,找以節點R爲根結點的子樹是包含樹B
    var result = false;
    
    //兩個樹都不爲空的情況下進行比較,否則返回false
    if(pRoot1!=null && pRoot2!=null){
        //找到對應樹B的根結點的點
        if(pRoot1.val == pRoot2.val){
            //以這個根結點爲起點進行判斷是否包含樹B
            result = haveTree(pRoot1,pRoot2);
        }
        if(!result){
            //如果找不到,就以pRoot1的左兒子爲起點,進行判斷
            result = haveTree(pRoot1.left,pRoot2);
        }
        if(!result){
            //如果還找不到,就以pRoot1的右兒子爲起點,進行判斷
            result = haveTree(pRoot1.right,pRoot2);
        }    
    }
    return result;
    
}
//判斷是否是子結構
function haveTree(root1,root2){
    //如果樹B已經遍歷結束,且都符合,返回true
    if(root2 == null)
        return true;
    //如果樹B沒有遍歷結束,但是樹A遍歷結束了,則結構不對,返回false
    if(root1 == null)
        return false;
    //如果有一個結點不同,則不符合條件,返回false
    if(root1.val != root2.val)
        return false;
    
    //如果根結點符合條件,則比較子節點
    return haveTree(root1.left,root2.left) && haveTree(root1.right,root2.right);
}

總結:

如果說鏈表的操作中遍歷居多,那麼樹中就是更多了些遞歸,鏈表有結點,樹也有結點,多了兩個子節點
next,和left、right 是具有同一效應的符號,這個需要注意一下。

鏈表結構的定義

function ListNode(x){
    this.val = x;
    this.next = null;
}

樹結構的定義

function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章