5/4学习总结

今天做了一些二叉树的题目找下感觉。

先就是关于求二叉树最大深度。

class Solution {
public:
    int maxDepth(TreeNode* root) {
      if(root==NULL)return 0;
      int k=1+max(maxDepth(root->left),maxDepth(root->right));
        return k;
    }
};

这里用的是后序遍历,其实相当于求的是高度,但是这高度等于深度其实没啥区别,要注意就是这里实质上是求得高度。

对于最小深度得话,有一个小坑就是,可能左子树或者右子树为空的情况没有考虑,所以直接加上一个判定条件即可完成。

class Solution {
public:
    int minDepth(TreeNode* root) {
        int k;
      if(root==NULL)return 0;
      if(root->left==NULL&&root->right!=NULL){return 1+minDepth(root->right);}
      else if(root->right==NULL&&root->left!=NULL){return 1+minDepth(root->left);}
      else return k=1+min(minDepth(root->left),minDepth(root->right));
    }
};

对于完全二叉树结点的求法,首先判断是否为完全满二叉树,如果是完全满二叉树的话则满足节点数 = 2^(树的高度+1) - 1
如果不满足则直接遍历相加。

class Solution {
public:
    int countNodes(TreeNode* root) {
       if(root == nullptr) return 0;
       TreeNode* left = root->left;
       TreeNode* right = root->right;
       int leftheight = 0, rightheight = 0;
       while(left) {
           left = left->left;
           leftheight++;
       }
       while(right) {
           right = right->right;
           rightheight++;
       }
       if(rightheight == leftheight) return (1 << (leftheight + 1)) - 1;
       else {
           int leftNodes = countNodes(root->left);
           int rightNodes = countNodes(root->right);
           return leftNodes + rightNodes + 1;
       }
    }
};

 因为这是看着视频学的,后面又看了一下其实根本不用判断是不是完全满二叉树,直接无脑遍历求点就行,判断完全满二叉树在求指数时还容易犯错。

class Solution {
public:
    int countNodes(TreeNode* root) {
       if(root == nullptr) return 0;
           int leftNodes = countNodes(root->left);
           int rightNodes = countNodes(root->right);
           return leftNodes + rightNodes + 1;
    }
};
直接就这么简单解决。

 对于这道平衡二叉树而言,首先复习什么是平衡二叉树,就是左右子树深度差不超过1的二叉树,对这道题而言其实就是前序遍历,但是要先把整体思路搞明白在开始写,不然的话一开始leftheight为什么等于-1都不知道,其实就是在下边遍历中结点的时候才算的。只是递归到上面做个判断,还有一点需要注意就是当root为空时也返回true,当时就这里错了还检查了半天。

class Solution {
public:
 bool isBalanced(TreeNode* root) {
     if(root==NULL)return true;
     else if(Balanced(root)==-1)return false;
     else return true;
 }
    int Balanced(TreeNode* root) {
          int leftheight,rightheight;
          if(root==NULL)return 0;
         leftheight=Balanced(root->left);
         rightheight=Balanced(root->right);
         if(leftheight==-1)return -1;
         if(rightheight==-1)return -1;
         if(abs(leftheight-rightheight)>1)return -1;
         else return 1+max(leftheight,rightheight);
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值