LeetCode C++刷题101-105题题解

目录

 

101 对称二叉树

题目

题解

完整代码

102 二叉树的层序遍历

题目

题解

完整代码

103 二叉树的锯齿形层次遍历

题目

题解

完整代码

104 二叉树的最大深度

题目

题解

完整代码

105 从前序与中序遍历构建二叉树

题目

题解

完整代码


101 对称二叉树

题目

给定一个二叉树,检查它是否是镜像对称的。

 

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
 

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3
 

进阶:

你可以运用递归和迭代两种方法解决这个问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

递归(遇到树的问题:优先考虑递归,其次考虑迭代)

完整代码

/**
 * 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 {
private:
    bool isSymmetric(TreeNode* l, TreeNode *r) {
        if(l == nullptr && r == nullptr) {
            return true;
        } else if(l == nullptr || r == nullptr) {
            return false;
        } else if(l->val != r->val) {
            return false;
        } 
        return isSymmetric(l->left, r->right) && isSymmetric(l->right, r->left);
    }
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) {
            return true;
        }

        return isSymmetric(root->left, root->right);
    }
};

102 二叉树的层序遍历

题目

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

 

示例:
二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

方法一:使用两个队列

方法二:使用一个队列

完整代码

/**
 * 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:
   // 方法一:使用两个队列
   /*
    vector> levelOrder(TreeNode* root) {
        if(root == nullptr) {
            return {};
        }
        // 层序遍历,使用栈来实现
        vector> result;
        queue s;
        s.push(root);
        while(!s.empty()) {
            queue temp;
            vector arr;
            while(!s.empty()) {
                TreeNode* node = s.front();
                s.pop();
                arr.push_back(node->val);
                if(node->left != nullptr) {
                    temp.push(node->left);
                }
                if(node->right != nullptr) {
                    temp.push(node->right);
                }
            }
            s = temp;
            result.push_back(arr);
        }
        return result;
    }
   */

   // 方法二:使用一个队列
   vector> levelOrder(TreeNode* root) {
       if(root == nullptr) {
           return {};
       }
       vector> result;
       queue que;
       que.push(root);
       while(!que.empty()) {
           int currentQueSize = que.size();
           vector tmp;
           for(int i = 0; i < currentQueSize; i++) {
               TreeNode* node = que.front();
               que.pop();
               tmp.push_back(node->val);
               if(node->left != nullptr) {
                   que.push(node->left);
               }
               if(node->right != nullptr) {
                   que.push(node->right);
               }
           }
           result.push_back(tmp);
       }
       return result;
   }
};

103 二叉树的锯齿形层次遍历

题目

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

迭代

完整代码

/**
 * 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:
    vector> zigzagLevelOrder(TreeNode* root) {
        if(root == nullptr) {
           return {};
       }
       vector> result;
       queue que;
       que.push(root);
       int order = 0;
       while(!que.empty()) {
           int currentQueSize = que.size();
           vector tmp;
           for(int i = 0; i < currentQueSize; i++) {
               TreeNode* node = que.front();
               que.pop();
               tmp.push_back(node->val);
               if(node->left != nullptr) {
                   que.push(node->left);
               }
               if(node->right != nullptr) {
                   que.push(node->right);
               }
           }
           if(order == 1) {
               reverse(tmp.begin(), tmp.end());
               order = 0;
           } else {
               order = 1;
           }
           result.push_back(tmp);
       }
       return result;
    }
};

104 二叉树的最大深度

题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

递归

完整代码

/**
 * 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:
    int maxDepth(TreeNode* root) {
        if(root == nullptr) {
            return 0;
        }
        return maxDepth(root, 1);
    }

    int maxDepth(TreeNode* root, int depth) {
        if(root == nullptr) {
            return depth - 1;
        }
        return max(maxDepth(root->left, depth + 1), maxDepth(root->right, depth + 1));
    }
};

105 从前序与中序遍历构建二叉树

题目

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

递归

完整代码

/**
 * 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 {
private:
    map idx;
public:
    TreeNode* buildTreeImp(vector& preorder, vector& inorder, int leftPreIdx,
                             int rightPreIdx, int leftInIdx, int rightInIdx) 
    {
        if(leftPreIdx > rightPreIdx) {
            return nullptr;
        }     

        int rootIdx = leftPreIdx;
        int inRootIdx = idx[preorder[rootIdx]];

        int length = inRootIdx - leftInIdx;

        TreeNode* root = new TreeNode(preorder[rootIdx]);

        root->left = buildTreeImp(preorder, inorder, leftPreIdx + 1, leftPreIdx + length, leftInIdx, inRootIdx - 1);
        root->right = buildTreeImp(preorder, inorder, leftPreIdx + length + 1, rightPreIdx, inRootIdx + 1, rightInIdx);
        return root;
    }
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        int n = preorder.size(); // 二叉树的节点数目

        // 构建中序遍历节点值到索引的映射
        for(int i = 0; i < n; ++i) {
            idx[inorder[i]] = i;
        }

        return buildTreeImp(preorder, inorder, 0, n - 1, 0, n - 1); 
    }
};

 

你可能感兴趣的:(LeetCode,C++刷题)