LeetCode104.二叉树的最大深度
题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)
思路:
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
递归:
/**
* 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* root) {
if(root == NULL) return 0;
int leftnum = getdepth(root->left);//左
int rightnum = getdepth(root->right);//右
int depth = 1 + max(leftnum,rightnum);//中,+1的原因是左,右执行后深度+1
return depth;
}
int maxDepth(TreeNode* root) {
return getdepth(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 maxDepth(TreeNode* root) {
int depth = 0;
if(root == NULL) return 0;
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
int size = que.size();
depth++;
for(int i = 0;i < size;i++) {
TreeNode* node = que.front();
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return depth;
}
};
LeetCode111.二叉树的最小深度
题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)
思路:
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。
dfs:
/**
* 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* root) {
if(root == NULL) return 0;
int leftnum = getdepth(root->left);
int rightnum = getdepth(root->right);
//当左子树为空,右子树不为空,不为最低点
if(root->left == NULL && root->right != NULL) return 1 + rightnum;
//当右子树为空,左子树不为空,不为最低点
if(root->left != NULL && root->right == NULL) return 1 + leftnum;
int result = 1 + min(rightnum,leftnum);
return result;
}
int minDepth(TreeNode* root) {
return getdepth(root);
}
};
bfs:
/**
* 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 minDepth(TreeNode* root) {
if(root == NULL) return 0;
queue<TreeNode*> que;
int depth = 0;
que.push(root);
while(!que.empty()) {
int size = que.size();
depth++;
for(int i = 0;i < size;i++) {
TreeNode* cur = que.front();
que.pop();
if(cur->left) que.push(cur->left);
if(cur->right) que.push(cur->right);
if(!cur->left && !cur->right) return depth;
}
}
return depth;
}
};
LeetCode222.完全二叉树的节点个数
题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)
思路:
1.普通二叉树
/**
* 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 gettree(TreeNode* root) {
if(root == NULL) return 0;
int leftn = gettree(root->left);
int rightn = gettree(root->right);
return 1 + leftn +rightn;
}
int countNodes(TreeNode* root) {
return gettree(root);
}
};
2.完全二叉树
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
/**
* 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 countNodes(TreeNode* root) {
int ldepth = 0,rdepth = 0;
if(root == nullptr) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
while(left) {
left = left->left;
ldepth++;
}
while(right){
right = right->right;
rdepth++;
}
if(ldepth == rdepth) {
return (2 << ldepth) - 1;//2<<相当于2*2,ldepth=0
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
};