劍指offer-js編寫-樹

來源:互聯網
上載者:User

標籤:ast   node   一個   若是   return   遞迴   false   樹的子結構   鏡像樹   

(1)

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

思路:首先找到A中結點的值與B相等的結點,然後從這兩個相同的結點出發,判斷是否存在重合,若是返回true。否則,在樹A的左右子樹中尋找與B結點值相同的結點,以這些結點出發遞迴判斷是否是A的子樹。

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
   if(pRoot2 == null || pRoot1 == null ) {
        return false;
    }
    var flag = false;
    if(pRoot1.val == pRoot2.val) {
        flag =  subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
     }
    if(!flag) {
        flag = HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2);
    }
    return flag;  
}
function subTree(pRoot1,pRoot2){   //判斷以root1和root2開頭的子數是否重合
    if(pRoot2 == null) {
        return true;
    }
    
    if(pRoot1 == null && pRoot2!=null) {
        return false;
    }
    if(pRoot1.val == pRoot2.val){
        return subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
    }
    return false;
}

(2)操作給定的二叉樹,將其變換為源二叉樹的鏡像。

二叉樹的鏡像定義:源二叉樹         8       /        6   10     / \  /     5  7 9 11    鏡像二叉樹        8       /        10   6     / \  /     11 9 7  5
思路:二叉樹的鏡像樹,通過可以看出,從根結點出發(先序遍曆思想),先交換根結點的孩子,再依次遞迴交換左子樹、右子數。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Mirror(root)
{
   if(root==null){
        return;
    }
    var temp=root.right;
    root.right=root.left;
    root.left=temp;
    Mirror(root.left);
    Mirror(root.right);
    return root;

}
(3)從上往下列印出二叉樹的每個節點,同層節點從左至右列印。
思路:二叉樹的層次遍曆,借用兩個數組即可。
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function PrintFromTopToBottom(root)
{
    var dequeTree=[]; //存放樹中的結點
    var result=[]; //儲存結果
    if(root==null){
        return [];
    }
    dequeTree.push(root);
    while(dequeTree.length){ //當dequeTree.length為0時,表明訪問完書中的結點
        pNode=dequeTree.shift();
        result.push(pNode.val);
        if(pNode.left)
            dequeTree.push(pNode.left);
        if(pNode.right)
            dequeTree.push(pNode.right);
    }
    return result;
    
}
(4)輸入一個整數數組,判斷該數組是不是某二叉搜尋樹的後序遍曆的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
解析:對於一棵二叉排序樹,存在特點:根結點的左子樹都小於根結點,根結點的右子數都大於根結點。後序遍曆最後訪問的是根結點,因此,對於一個整數
數組,最後一個元素肯定是根結點,並且如果前部分(左子樹)都小於最後一個元素(根結點),後部分(右子樹)都大於最後一個元素(根結點)。遞迴判
斷前部分和後部分是否是二叉排序樹。
function VerifySquenceOfBST(sequence)
{
    if(sequence.length==0){
        return false;
    }
    return jurge(sequence,0,sequence.length-1);
    function jurge(sequence,first,last){
        if(first==last)
            return true;
        var max=sequence[last];
        var temp1=first;
        while(sequence[temp1]<max&&temp1<last){
            temp1++;
        }
        temp1=temp1-1;
        var temp2=temp1+1;
        while(sequence[temp2]>max&&temp2<last){
            temp2++;
        }
        if(temp2==last)
            return true;
        if(temp2!=last)
            return false;   
        var a1=jurge(sequence,first,temp1);
        var a2=jurge(sequence,temp1+1,last-1);
        return a1&&a2;
    }
}

劍指offer-js編寫-樹

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.