一刷还是以递归法为主,下面的题目都是默认递归法
Leetcode 110 平衡二叉树
题目链接 110 平衡二叉树
本题目和二叉树的最大深度差不多,但是还是要注意几个点的:
思路:如果我们的左右子树不是平衡二叉树了,那么整个二叉树就不是平衡二叉树,所以我们就不记录高度,用-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 getHeight(TreeNode* node){
if(node == NULL){
return 0;
}//结束判断后返回上一层递归
int leftHeight = getHeight(node->left);
if(leftHeight == -1) return -1;
int rightHeight = getHeight(node->right);
if(rightHeight == -1) return -1;
int rsult;
if(abs(leftHeight-rightHeight) > 1){
return -1;
}else{
return 1+max(leftHeight,rightHeight);
}
}
bool isBalanced(TreeNode* root) {
if(getHeight(root) == -1){
return false;
}else{
return true;
}
}
};
Leetcode 257. 二叉树的所有路径
题目链接 257 二叉树的所有路径
本题目需要将二叉树的全部节点输出出来,我们肯定要遍历一遍才能将全部的节点都记录一遍,所以,此时我们就要考虑遍历方式,我们会发现输出结果是从根节点往左往右来输出的,所以我们需要前序遍历,在这里,我们去观察输出结果,会发现左右子树需要前后输出,递归完成左子树时,我们就要回溯根节点重新往右子树,所以我们需要用到回溯,递归中已经用到了,但是没有体现出来,但是今天我们要将递归中的回溯写出来。
下面上代码加注释:
/**
* 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 {
private:
void traversal(TreeNode* cur,vector& path,vector& result){
path.push_back(cur->val);//中,中为什么写在这里,因为最后一个节点也要加入到path中
if(cur->left == NULL && cur->right == NULL){
string sPath;
for(int i=0;ileft){
traversal(cur->left,path,result);//遍历记录左边
path.pop_back();//回溯
}
if(cur->right){
traversal(cur->right,path,result);//遍历记录右边
path.pop_back();//回溯
}
}
public:
vector binaryTreePaths(TreeNode* root) {
vector result;
vector path;
if(root == NULL){
return result;//根节点为0,就结束
}
traversal(root,path,result);
return result;
}
};
可能会遇到的问题:
这里使用vector 结构path来记录路径,所以要把vector 结构的path转为string格式,再把这个string 放进 result里。
那么为什么使用了vector 结构来记录路径呢? 因为在下面处理单层递归逻辑的时候,要做回溯,使用vector方便来做回溯。
Leetcode 404. 左叶子之和
题目链接 404 左叶子之和
审清题目,什么是左叶子之和,首先要明白什么是叶子节点,叶子节点的左右子节点都为空,然后什么是左叶子节点,就是节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点,理解了这一点,这个题就差不多了,下面上代码加注释:
/**
* 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 sumOfLeftLeaves(TreeNode* root) {
if(root == NULL){//结束条件
return 0;
}
if(root->left == NULL && root->right == NULL){
return 0;//其实这个也可以不写,如果不写不影响结果,但就会让递归多进行了一层。
}
int leftValue = sumOfLeftLeaves(root->left);//递归,左
if(root->left && !root->left->left && !root->left->right){//左叶子点的判断
leftValue = root->left->val;
}
int rightValue = sumOfLeftLeaves(root->right);//递归,右
int sum = leftValue + rightValue;//中
return sum;
}
};
end;周天大总结!!!