110.平衡二叉树
题目链接:. - 力扣(LeetCode)
视频讲解:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树
题目描述:
给定一个二叉树,判断它是否是
平衡二叉树
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true
解题思路:
getHeight()函数返回-1表示以node为根节点的树不是平衡二叉树
使用后序遍历方法,函数返回值表示以node为根节点的树的高度
代码:
class Solution {
public:
int getHeight(TreeNode* node)
{
if(node == nullptr) return 0;
int leftheight = getHeight(node->left);
if(leftheight == -1) return -1;
int rightheight = getHeight(node->right);
if(rightheight == -1) return -1;
if(abs(leftheight-rightheight) > 1) return -1;
else return 1 + (leftheight > rightheight ? leftheight : rightheight);
}
bool isBalanced(TreeNode* root) {
if(root == nullptr) return true;
int flag = getHeight(root);
if(flag == -1) return false;
return true;
}
};
257. 二叉树的所有路径
题目链接:. - 力扣(LeetCode)
视频讲解:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径
题目描述:
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
解题思路:
使用前序遍历。涉及回溯方法。当到达 叶子节点后就会进行回溯操作返回上一层双亲节点
代码:
class Solution {
public:
void getAllPath(TreeNode* node, vector<int>& path, vector<string>& result)
{
path.push_back(node->val);//最后一个节点也要加入到path中
if(node->left == nullptr && node->right == nullptr)
{
string s;
for(int i = 0; i < path.size(); i++)
{
s += to_string(path[i]);
if(i < path.size()-1) s += "->";
}
result.push_back(s);
return;
}
if(node->left)
{
getAllPath(node->left,path,result);
path.pop_back();// 回溯
}
if(node->right)
{
getAllPath(node->right,path,result);
path.pop_back();// 回溯
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
getAllPath(root,path,result);
return result;
}
};
404.左叶子之和
题目链接:. - 力扣(LeetCode)
视频讲解:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和
题目描述:
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
解题思路:
- 叶子节点和空节点均返回0:题目中要求为左叶子节点,当递归到叶子节点时不能判断是左还是右,因此返回0;
- 后序遍历:中节点保存其左右子树中的左叶子节点之和。
代码:
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr) return 0;
if(root->left == nullptr && root->right == nullptr) return 0;
int leftsum = sumOfLeftLeaves(root->left); // 左
if(root->left && root->left->left == nullptr && root->left->right == nullptr)
leftsum = root->left->val;
int rightsum = sumOfLeftLeaves(root->right);//右
return leftsum + rightsum;//中
}
};
222.完全二叉树的节点个数
题目链接:. - 力扣(LeetCode)
视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量
题目描述:
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
示例 1:
输入:root = [1,2,3,4,5,6] 输出:6
解题思路:
拿到这一题想法:
- 用后序遍历:自下而上可以保证节点不重复
- 到空节点结束:到空节点只需返回0即可,若到叶子节点结束,则要考虑如何进行节点计数
代码:
class Solution {
public:
int countNodes(TreeNode* root) {
if(root == nullptr) return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
};