104.二叉树的最大深度
思路
通过求二叉树的高度来求二叉树的最大深度
解题方法
因为二叉树节点高度的定义是节点到叶子结点的最长路径边的条数或节点数, 是从下往上数,所以采用后序遍历。而根节点的高度就是二叉树的最大深度。
Code
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int getheight(TreeNode*node)
{
if(node==NULL)return 0;
int leftheight=getheight(node->left);
int rightheight=getheight(node->right);
int height=1+max(leftheight,rightheight);
return height;
}
int maxDepth(TreeNode* root) {
return getheight(root);
}
};
111.二叉树的最小深度
思路
和求二叉树的最大深度很类似,但又有细微不同。
解题方法
不同之处在于,最小深度的定义在于从根节点到最近叶子结点的最短路径上的节点数,因此需要在根节点存在的前提下判断,根节点的左右孩子是否存在,总共三种情况,1.左存在,右不存在。2.左不存在,右存在。3.都存在和都不存在为一种情况。
Code
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int getheight(TreeNode*node)
{
if(node==NULL)return 0;
int leftheight=getheight(node->left);
int rightheight=getheight(node->right);
if(node->left==NULL&&node->right!=NULL)return 1+rightheight;
if(node->right==NULL&&node->left!=NULL)return 1+leftheight;
int result=1+min(leftheight,rightheight);
return result;
}
int minDepth(TreeNode* root) {
return getheight(root);
}
};
222.完全二叉树的节点个数
思路
和求二叉树的最大深度,最小深度类似
解题方法
不同之处在于,题目求的是,节点个数,所以根节点的左右子树的节点个数直接加,最后再加一。
Code
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int getNoesnum(TreeNode*node)
{
if(node==NULL)return 0;
int leftnodesnum=getNoesnum(node->left);
int rightnodesnum=getNoesnum(node->right);
int result=1+leftnodesnum+rightnodesnum;
return result;
}
int countNodes(TreeNode* root) {
return getNoesnum(root);
}
};