110.平衡二叉树
题目链接/文章讲解/视频讲解:代码随想录
解题思路
平衡二叉树:左右节点的子树高度差不超过1,因为求高度我们使用后序遍历,递归函数返回值是int,因为我们需要记录左右子树的高度进行比较,父节点像孩子收集信息,并返回给父节点,如果不是平衡二叉树,直接返回-1,如果是则返回1+左右子树最高的高度
class Solution {
public:
int getHeight(TreeNode* node)
{
if(node==nullptr) return 0; //空节点高度为0
int leftHeight = getHeight(node->left); //获取左子树高度
if(leftHeight==-1) return -1; //如果左子树已经不是平衡二叉树了,向上返回-1
int rightHeight = getHeight(node->right);
if(rightHeight==-1) return -1;
if(abs(leftHeight-rightHeight)>1) return -1; //中节点的处理过程
else return 1+max(leftHeight,rightHeight);
}
bool isBalanced(TreeNode* root) {
if(root==nullptr) return true;
return getHeight(root)==-1 ? false: true;
}
};
257. 二叉树的所有路径
题目链接/文章讲解/视频讲解:代码随想录
解题思路
这题用前序,因为路径是由自己出发的,再去找左右路径,这里找路径的过程涉及回溯的过程,注意要先放节点,再判断递归结束条件,否则会漏掉叶子节点 ,我错的地方:回溯和递归是一一对应的,有一个递归,就要有一个回溯
class Solution {
public:
void TravelSal(TreeNode* node,vector<int>& path,vector<string>& result)
{
path.push_back(node->val); //中,将自己放进路径
if(node->left==nullptr && node->right == nullptr) //当左右孩子都为空,那么自己为叶子节点,此时已经是一条路径结果了
{
string sPath;
for(int i=0;i<path.size()-1;i++)
{
sPath += to_string(path[i]);
sPath += "->";
} //最后一个单独处理
sPath += to_string(path[path.size()-1]);
result.push_back(sPath);
return;
}
//如果不是叶子节点则去递归他的左右子树
if(node->left){
TravelSal(node->left,path,result);
path.pop_back();
}
if(node->right)
{
TravelSal(node->right,path,result);
path.pop_back(); //回溯
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
vector<string> result;
TravelSal(root,path,result);
return result;
}
};
对于回溯的理解,我们直接看最后的子树,当叶子节点执行完return后,从函数中出来,那么就需要pop掉这个叶子节点,然后去遍历右节点,同样的pop后,那么这个最后的子树的父节点作为上一级子树的左节点也遍历完了,就pop掉即可,以此类推
404.左叶子之和
题目链接/文章讲解/视频讲解: 代码随想录
解题思路
我们只需要收集孩子信息返回给父节点即可,利用后序遍历,但这里我们对于左叶子节点的操作,应该由其父节点操作,返回给上一个节点即可,而作为叶子节点,本身没有子树,返回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 && !root->left->right)
{
leftSum = root->left->val;
}
int rightSum = sumOfLeftLeaves(root->right);
return leftSum+rightSum;
}
};
收获
递归都不太难,每日打卡