zoukankan      html  css  js  c++  java
  • leetcode刷题笔录5

    数组转平衡二叉查找树

    • 给定一个已排序的数组,将其转化为一棵平衡二叉查找树。平衡的概念是:任一节点的左子树和右子树的深度之差不大于1。
    • 思路:数组是可以通过下标来访问的,所以去中点作为根节点,然后递归地生成左右子树。
    • 实现:
      /**
       * Definition for binary tree
       * struct TreeNode {
       *     int val;
       *     TreeNode *left;
       *     TreeNode *right;
       *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
       * };
       */
      class Solution {
      public:
          TreeNode *sortedArrayToBST(vector<int> &num) {
              return _sortArrayToBST(num, 0, num.size()-1);
          }
      private:
          TreeNode *_sortArrayToBST(vector<int> &num, int i, int j){
              if(i>j){
                  return NULL;
              }
              else{
                  int r = (i+j+1)/2;
                  TreeNode *root = new TreeNode(num[r]);
                  root->left = _sortArrayToBST(num, i, r-1);
                  root->right = _sortArrayToBST(num, r+1, j);
                  return root;
              }       
          }
      }; 

     链表转平衡二叉树

    • 给定一个已排序的链表,将其转化为一棵平衡二叉查找树。
    • 将链表转化为数组,再按照上一个方法实现,并为造成时间复杂度的增加。
    • 实现:
      /**
       * Definition for singly-linked list.
       * struct ListNode {
       *     int val;
       *     ListNode *next;
       *     ListNode(int x) : val(x), next(NULL) {}
       * };
       */
      /**
       * Definition for binary tree
       * struct TreeNode {
       *     int val;
       *     TreeNode *left;
       *     TreeNode *right;
       *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
       * };
       */
      class Solution {
      public:
          TreeNode *sortedListToBST(ListNode *head) {
              vector<int> num;
              while(head != NULL){
                  num.push_back(head->val);
                  head=head->next;
              }
              return _sortArrayToBST(num, 0, num.size()-1);
              
          }
      private:
          TreeNode *_sortArrayToBST(vector<int> &num, int i, int j){
              if(i>j){
                  return NULL;
              }
              else{
                  int r = (i+j+1)/2;
                  TreeNode *root = new TreeNode(num[r]);
                  root->left = _sortArrayToBST(num, i, r-1);
                  root->right = _sortArrayToBST(num, r+1, j);
                  return root;
              }
          }
      }; 

    二叉树的层序遍历

    • 给定一棵二叉树,按照节点深度的顺序输出所有节点的值,同一层的节点按照从左到右的顺序输出。比如,给出二叉树:
          3
         / \
        9  20
          /  \
         15   7

      则应当输出

      [
        [3],
        [9,20],
        [15,7]
      ]
    • 思路:在函数外维护一个值,记录当前节点的深度,输出时就依据这个值向二维数组中插入节点的值。
    • 实现:
      class Solution {
      public:
          vector<vector<int>> levelOrder(TreeNode *root) {
              vector<vector<int>> rslt;
              _levelOrder(root, 0, rslt);
              return rslt;
          }
          
          void _levelOrder(TreeNode *root, int i, vector<vector<int>>& rslt){
              if(root == NULL){
                  return;
              }
              else{
                  if(i>(int)(rslt.size())-1){
                      vector<int> tmp;
                      tmp.push_back(root->val);
                      rslt.push_back(tmp);
                  }
                  else{
                      rslt[i].push_back(root->val);
                  }
                  _levelOrder(root->left, i+1, rslt);
                  _levelOrder(root->right, i+1, rslt);            
              }
          }
      }; 

    二叉树的逆层序遍历

    • 给定一棵二叉树,按照逆向层序遍历所有节点值。
    • 思路:同上,获得结果后逆序即可。
      class Solution {
      public:
          vector<vector<int>> levelOrderBottom(TreeNode *root) {
              vector<vector<int>> rslt;
              _levelOrder(root, 0, rslt);
              vector<vector<int>> rsltReverse;
              for(int i=rslt.size()-1; i>=0; i--){
                  rsltReverse.push_back(rslt[i]);
              }
              return rsltReverse;
          }
          
          void _levelOrder(TreeNode *root, int i, vector<vector<int>>& rslt){
              if(root == NULL){
                  return;
              }
              else{
                  if(i>(int)(rslt.size())-1){
                      vector<int> tmp;
                      tmp.push_back(root->val);
                      rslt.push_back(tmp);
                  }
                  else{
                      rslt[i].push_back(root->val);
                  }
                  _levelOrder(root->left, i+1, rslt);
                  _levelOrder(root->right, i+1, rslt);            
              }
          }
      }; 

    同一棵树

    • 给定两棵二叉树,判断其是否完全相同。
    • 思路:如果两棵二叉树的节点值相同,而且左右子树都相同,那么二叉树就完全相同。注意考虑二叉树为空的情况。
      /**
       * Definition for binary tree
       * struct TreeNode {
       *     int val;
       *     TreeNode *left;
       *     TreeNode *right;
       *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
       * };
       */
      class Solution {
      public:
          bool isSameTree(TreeNode *p, TreeNode *q) {
              if(p==NULL && q==NULL){
                  return true;
              }
              else if(p==NULL || q==NULL){
                  return false;
              }
              else if(p->val == q->val){
                  return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
              }
              else{
                  return false;
              }
          }
      }; 

    对称二叉树

    • 给定一棵二叉树,判断其是否是对称的。
    • 思路:这里应当把“一棵对称的二叉树”问题转化为“两棵对称的二叉树”问题。如果两棵二叉树节点值相同,而且树A的左子树与树B的右子树对称,树A的右子树与树B的左子树对称,那么这两棵二叉树就是对称的。如果某一棵二叉树的左右子树对称,那么它就是“一棵对称的二叉树”。
    • 实现:
      /**
       * Definition for binary tree
       * struct TreeNode {
       *     int val;
       *     TreeNode *left;
       *     TreeNode *right;
       *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
       * };
       */
      class Solution {
      public:
          bool isSymmetric(TreeNode *root) {
              if(root==NULL){
                  return true;
              }
              else{
                  return _isSymmetric(root->left, root->right);
              }
          }
          
          bool _isSymmetric(TreeNode *root1, TreeNode *root2){
              if(root1==NULL && root2==NULL){
                  return true;
              }
              else if(root1==NULL || root2==NULL){
                  return false;
              }
              else if(root1->val == root2->val){
                  return _isSymmetric(root1->left, root2->right) && _isSymmetric(root1->right, root2->left);
              }
              else{
                  return false;
              }
              
          }
      };
    作者:一叶斋主人
    出处:www.cnblogs.com/yiyezhai
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Luogu P1090 合并果子(优先队列 || priority_queue)
    Luogu P1012 拼数
    hibernate5.2的基本配置
    [bzoj1210][HNOI2004]邮递员【插头dp】
    [bzoj3470]Freda’s Walk【概率与期望dp】
    [bzoj4851][Jsoi2016]位运算【矩阵乘法】【状压dp】
    [bzoj4852][Jsoi2016]炸弹攻击【随机化】
    [bzoj4853][Jsoi2016]飞机调度【最短路】【网络流】
    [bzoj4850][Jsoi2016]灯塔【暴力】
    [bzoj4919][Lydsy1706月赛]大根堆【dp】【启发式合并】【stl】
  • 原文地址:https://www.cnblogs.com/yiyezhai/p/3027873.html
Copyright © 2011-2022 走看看