110. 平衡二叉树 - 力扣(LeetCode)
给定一个二叉树,判断它是否是平衡二叉树。平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。
求左右子树的高度
class Solution {
public:
bool isBalanced(TreeNode* root) {
return getheight(root)==-1?0:1;//如果是-1,说明不平衡
}
//求高度的函数
int getheight(TreeNode* node){
if(node == nullptr) return 0;
int L = getheight(node->left);
if(L == -1) return-1;//若该节点左子树不平衡,整棵树无法平衡,一直向上传递-1即可。
int R = getheight(node->right);
if(R == -1) return-1;
if(abs(L-R)>1) return -1;
else return 1+max(L,R);//求的是最高高度
}
};
257. 二叉树的所有路径 - 力扣(LeetCode)
给你一个二叉树的根节点
root,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
通过一次遍历就能找到所有路径,所以要做的就是在遍历的过程中记录路径。
Path记录了从根节点走到当前节点的路径,是不断增减的,当走到叶子节点时,会记录到AllPath中。
void traverse(TreeNode* node){
Path.push_back(node->val);//把当前节点加入路径
if(!node->left&&!node->right){//当前节点是叶子节点,记录路径,该层递归结束
AllPath.push_back(Path);
return;
}
if(node->left){//往左下走一步
traverse(node->left);
//整个traverse只有走到叶子节点才会有出口,或者3个if都结束
Path.pop_back();//回溯这一步
}
if(node->right){//往右下走一步
traverse(node->right);
Path.pop_back();//回溯这一步
}
}
traverse(node->left)往下走了一步,等这个函数退出,说明找到了该节点node->left子树中的所有叶子节点,并记录到AllPath,此时,包含该节点的路径已经全部找到,应该删除这个节点,如果非空,会把node->right加入路径,等找到所有的路径,node->right也会被删除。与此同时,traverse(node)结束,node也会被删除。
class Solution {
private:
//int cur;
vector<vector<int>> AllPath;
vector<int> Path;
public:
vector<string> binaryTreePaths(TreeNode* root) {
traverse(root);
vector<string> ans;
for(vector<int> p:AllPath){
string a;
for(int i = 0;i<p.size()-1;i++){
a+=(to_string(p[i])+"->");
}
a+=to_string(p.back());
ans.push_back(a);
}
return ans;
}
void traverse(TreeNode* node){
Path.push_back(node->val);//把当前节点加入路径
if(!node->left&&!node->right){//当前节点是叶子节点,记录路径,该层递归结束
AllPath.push_back(Path);
return;
}
if(node->left){
traverse(node->left);
//整个traverse只有走到叶子节点才会有出口
Path.pop_back();
}
if(node->right){
traverse(node->right);
Path.pop_back();
}
}
};
404. 左叶子之和 - 力扣(LeetCode)
给定二叉树的根节点
root,返回所有左叶子之和。
比较简单,一次遍历就能遍历完所有的左叶子节点,只要通过if判断累加每个符合条件的节点的val即可
class Solution {
private:
int sum = 0; //外部变量记录总和
public:
int sumOfLeftLeaves(TreeNode* root) {
traverse(root);
return sum;
}
void traverse(TreeNode* node){
if(node==nullptr) return;
traverse(node->left);
if(node->left&&!node->left->left&&!node->left->right) sum+=node->left->val;
//左子节点,一定是node->left可以访问的
//叶子节点,该节点->left、该节点->right一定为空
//满足上面两个条件(但是是三个指针)即可
traverse(node->right);
}
};
222. 完全二叉树的节点个数 - 力扣(LeetCode)
给你一棵 完全二叉树 的根节点
root,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第
h层(从第 0 层开始),则该层包含1~ 2h个节点。
这样就能AC
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr) return 0;
int L = countNodes(root->left);
int R = countNodes(root->right);
return L+R+1;
}
};
但递归可以提前结束,也就是找到满二叉树时,该结点下的子树就不需要再递归计算节点数
完全二叉树的前提下,如果左右深度一样,就是满二叉树
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr) return 0;
//如果遇到满二叉树,就不用继续往后遍历
//**********************************//
TreeNode* left = root->left; //
TreeNode* right = root->right; //
int ldepth = 1; //
int rdepth = 1; //
while(left){ //
left = left->left; //
ldepth++; //
} // <- 剪枝
while(right){ //
right = right->right; //
rdepth++; //
} //
if(ldepth == rdepth){ //
return (2<<(ldepth-1))-1; //
} //
//**********************************//
int L = countNodes(root->left);
int R = countNodes(root->right);
return L+R+1;
}
};