104.二叉树的最大深度
二叉树深度是从上往下数(前序遍历),高度是从下往上数(后序遍历),根节点的高度就是二叉树的最大深度,所以这道题是使用后序遍历。
/**
* 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 getdepth(TreeNode* node){
if(node == NULL)return 0;
int leftheight=getdepth(node->left);
int rightheight=getdepth(node->right);
int depth = 1+max(leftheight,rightheight);
return depth;
}
int maxDepth(TreeNode* root) {
return getdepth(root);
}
};
111.二叉树的最小深度
注意审题:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
叶子节点,左右孩子都为空的节点才是叶子节点
也是使用后序遍历,注意避开陷阱,root结点的左孩子或右孩子为空的情况
/**
* 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.完全二叉树的节点个数
方法一:当成普通二叉树递归
/**
* 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 getNumber(TreeNode* node){
if(node==NULL)return 0;
int leftNum = getNumber(node->left);
int rightNum = getNumber(node->right);
int treeNum = leftNum + rightNum + 1;
return treeNum;
}
int countNodes(TreeNode* root) {
return getNumber(root);
}
};
方法二:利用完全二叉树的性质递归
/**
* 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 getNumber(TreeNode* node){
if(node == NULL)return 0;
TreeNode* left=node->left;
TreeNode* right=node->right;
int leftDepth = 0,rightDepth = 0;
while(left){
left = left->left;
leftDepth++;
}
while(right){
right = right->right;
rightDepth++;
}
if(leftDepth==rightDepth){
return(2<<leftDepth)-1;
}
int leftTreeNum = countNodes(node->left);
int rightTreeNum = countNodes(node->right);
int result=leftTreeNum+rightTreeNum+1;
return result;
}
int countNodes(TreeNode* root) {
return getNumber(root);
}
};