c++刷题(15/100)矩阵转置,最深子树

题目一:矩阵转置

给定一个矩阵 A, 返回 A 的转置矩阵。

矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

 

示例 1:

输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]

示例 2:

输入:[[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

思路:比较简单,但要注意对矩阵的初始化,如果不初始化会报错--》reference binding to null pointer of type 'struct value_type'

class Solution {
public:
    vector<vector<int>> transpose(vector<vector<int>>& A) {
        if(A.size()==0){
            return A ;
        }
        vector<vector<int>> Ar(A[0].size()); 
        for (int i = 0;  i < Ar.size(); i++) Ar[i].resize(A.size()); 
        
        for (int i = 0; i<A[0].size(); i++) {
            for (int j = 0; j<A.size(); j++) {
                Ar[i][j] = A[j][i];
            }
        }
        return Ar ;
    }
};

题目二:

具有所有最深结点的最小子树

给定一个根为 root 的二叉树,每个结点的深度是它到根的最短距离。

如果结点具有最大深度,则该结点是最深的

返回具有最大深度的结点,以该结点为根的子树中包含所有最深的结点。

输入:[3,5,1,6,2,0,8,null,null,7,4]
输出:[2,7,4]
解释:

我们返回值为 2 的结点,在图中用黄色标记。
在图中用蓝色标记的是树的最深的结点。
输入 "[3, 5, 1, 6, 2, 0, 8, null, null, 7, 4]" 是对给定的树的序列化表述。
输出 "[2, 7, 4]" 是对根结点的值为 2 的子树的序列化表述。
输入和输出都具有 TreeNode 类型。

思路:这个题要注意的是,不是返回一个最深的节点,而是返回一个包含所有最深的子树,也就是如果是一颗满二叉树,那么就返回跟节点。然后就只要判断左右两个孩子哪个节点更深,就返回哪个,如果一样深就返回当前根节点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
public:
    TreeNode* find(TreeNode* root){
        if(root==NULL){
            return NULL  ;
        }
        int depofL = getLen(root->left) ;
        int depofR = getLen(root->right) ;
        if(depofL==depofR){
            return root ;
        }
        if(depofL>depofR){
            return find(root->left) ;
        }else{
            return find(root->right) ;
        }
    }
    int getLen(TreeNode* root){
        if(root==NULL){
            return 0  ;
        }
        return 1+max(getLen(root->left),getLen(root->right)) ;
    }
    TreeNode* subtreeWithAllDeepest(TreeNode* root) {
        TreeNode* ans = find(root) ;
        return ans ;
    }
};

 

题目三:重构二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:这个题就是对照两种序列把序列分段然后递归,递归左右子树的时候记得要记录每一次递归时两种序列的开始和结束位置

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* build(vector<int>& preorder, int pS, int pE, vector<int>& inorder, int iS, int iE){
        for(int i=iS;i<=iE;i++){
            if(inorder[i]==preorder[pS]){
                TreeNode* root = new TreeNode(preorder[pS]) ;
                int lenofL = i-iS ;
                root->left = i==iS? NULL : build(preorder,pS+1,pS+lenofL,inorder,iS,i-1) ;
                root->right = i==iE? NULL : build(preorder,pS+lenofL+1,pE,inorder,i+1,iE) ;
                return root ;
            }
        }
        return NULL ;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int len = preorder.size() ;
        if(len<1){
            return NULL ;
        }
        return build(preorder,0,len-1,inorder,0,len-1) ;
    }
};

  

 

posted @ 2018-07-08 23:30  mask_天俊  阅读(527)  评论(0编辑  收藏  举报