今天做了一些二叉树的题目找下感觉。
先就是关于求二叉树最大深度。
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);
}
};