1. 程式人生 > >劍指offer(十七,十八,十九)樹的子結構,二叉樹的映象,順時針列印矩陣

劍指offer(十七,十八,十九)樹的子結構,二叉樹的映象,順時針列印矩陣

簡單題,判斷好每種情況,(原來劍指offer這個oj需要把js的函式寫在給的solution函式裡才能AC啊)

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

function HasSubtree(pRoot1, pRoot2)
{ 
    // write code here
    if(pRoot1 !== null && pRoot2 !== null) {
        if( judge(pRoot1,pRoot2) ){ 
            return true;
        }else {
            return HasSubtree(pRoot1.left,pRoot2) || HasSubtree(pRoot1.right,pRoot2)
        }
    }else {
        return false
    }
     function judge(p1, p2) {
        if(p2===null) return true;
        if(p1===null) return false;
        if(p1.val !== p2.val )return false; 
        return judge(p1.left,p2.left)&&judge(p1.right,p2.right);
    }
}

傳說中的毒瘤題,曾經的一個大佬去google面試時現場沒寫出來,被google說滾蛋。。。
其實很簡單,老樣子樹結構判斷好null

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Mirror(root)
{
    if(root) {
      var tmp = root.left;
      root.left = root.right;
      root.right = tmp;
      if(root.left) {
        Mirror(root.left);
      }
      if(root.right) {
        Mirror(root.right);
      }
    }
}
module.exports = {
    Mirror : Mirror
};

之前就遇到別人討論過這題,今天碰到這題也格外的親切,一種很好的思路:控制好要列印的矩形邊界,遍歷即可,一個矩形可由左上點和又下角的點確定(最近做的一個專案就遇到畫矩形相關)。一開始時時打算每次直接暴力遍歷矩形邊,遍歷完一次外邊界後用splice刪除遍歷的元素,其實沒必要。自己控制邊界點即可。

function printMatrix(matrix)
{
    var row = matrix.length;
    var col = matrix[0].length;
    if(row===0||col===0) return null;
    row--;
    col--;
    var ans = [];
    //定義好左上點和右下點,把矩陣建立以左上點為座標
    let left = 0,top = 0,right = col,bottom = row;
    while(left <= right && top <= bottom) {
      //四個迴圈,分別控制頂層,右邊界,底層,左邊界的遍歷
      //現在是上邊界,從左到右
      for(let i = left; i<=right; i++) {
        ans.push(matrix[top][i]);
      }
      //現在到達了右邊界,從上到下
      for(let i = top+1; i<=bottom; i++) {
        ans.push(matrix[i][right]);
      }
      //現在到了下邊界,從右到左
      if(bottom>top) {//防止單行重複遍歷
        for(let i = right-1; i>=left; i--) {
          ans.push(matrix[bottom][i]);
        }
    }
      //現在到了左邊界,從下往上
      if(right>left){//防止單列重複遍歷
        for(let i = bottom-1; i>top; i--) {//注意這裡不能等於,起點肯定是被push了的
          ans.push(matrix[i][left]);
        }
    }
      //控制邊界
      left++,top++,right--,bottom--;
    }
    return ans;
}
var matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]];
console.log(printMatrix(matrix));

相關推薦

offer()子結構映象時針列印矩陣

簡單題,判斷好每種情況,(原來劍指offer這個oj需要把js的函式寫在給的solution函式裡才能AC啊) /* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ fun

offer

包含 存在 例如 保存 模式識別 post 測試 mark 輸入一個整數 30.連續子數組的最大和 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決

offer題】斐波那契數列

題目描述 大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39 剛開始覺得輸入為一個數,然後找到這個數在斐波那契數列中的位置

Offer】15時針列印矩陣

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 時間限制:

[offer] --20.時針列印矩陣

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. p

【Python資料結構與演算法】【offer時針列印矩陣

題目描述與連結: https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=/ta/coding-intervi

Offer(29):時針列印矩陣

題目 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每個數字,例如,如果輸入如下矩陣: 則依次打印出陣列:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。 思路 將結果存放在vector 陣列中,從左到右,再從

offer——(8)重建&&的深度

/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x)

[offer]時針列印矩陣

調了兩三小時,從通過11%的案例,到60%,再到80%,再到100% 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,1

Offer - 19:時針列印矩陣

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,

offer——(17)時針列印矩陣

學資料結構的時候有做過一道類似的題目,不一樣的是當時的二維陣列規定是正方形,而這裡是矩形,然後我就不會了。。  演算法圖示(4x3矩陣): ac程式碼(java): import java.util.ArrayList; public class Solut

offer-19:時針列印矩陣

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 程

offer時針列印矩陣

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字

offer-時針列印矩陣(陣列)

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.  

offer——19.時針列印矩陣

題目描述: 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11

offer{15-18}】反轉連結串列、合併兩個排序的連結串列、子結構映象

反轉連結串列、合併兩個排序的連結串列、樹的子結構、二叉樹的映象反轉連結串列題目描述C++程式碼題目描述C++程式碼樹的子結構題目描述C++程式碼題目描述C++程式碼 反轉連結串列 題目描述 輸入一

offer{19-22}】時針列印矩陣、包含min函式的棧、棧的壓入彈出序列、從上往下列印

順時針列印矩陣、包含min函式的棧、棧的壓入彈出序列、從上往下列印二叉樹 順時針列印矩陣 題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣:

offer時針列印矩陣【python】

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字

offer66題--Java實現c++實現和python實現 19.時針列印矩陣

題目描述 輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. C++

Offer——:把列印成多行(層序遍歷)

對於二叉樹的最好的解決辦法就是遞迴。遍歷方法無外乎先序遍歷,中序遍歷,後序遍歷方法以及層序遍歷方法。這裡給大家安利一個關於樹的面試題的連結,博主walkinginthewind比較全面且詳細的介紹了二叉樹相關的面試題:對於層序遍歷,最好的方法就是用佇列記錄遍歷節點的值,按層列