给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false
示例 3:
输入:root = [] 输出:true
左右子树的高度差大于1则返回-1,表示这棵树不是平衡二叉树
这道题应该采用二叉树的后序遍历,左右中,从叶子节点向上遍历,记录左右子树的高度,判断左右子树的高度差,若大于1则返回-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 getHeight(TreeNode*root)
{
if(root==NULL) return 0;
int le = getHeight(root->left);
if(le==-1) return -1;
int ri = getHeight(root->right);
if(ri==-1) return -1;
int result;
if(abs(le-ri)>1) result = -1;
else
result = max(le,ri)+1;
return result;
}
bool isBalanced(TreeNode* root) {
if(root==NULL) return true;
int result = getHeight(root);
if(result==-1) return false;
return true;
}
};
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
提示:
[1, 100]
内-100 <= Node.val <= 10
这道题很好的体现了递归回溯。
递归三部曲:
第一部:确定返回值和参数。
void treval(TreeNode* root,vector
我们传进去一个vector
vector
第二部:确定递归的终止条件
if(root->left==NULL&&root->right==NULL)
当我们遍历到叶子节点就证明该收获结果的时候了。
第三部:写一次递归的逻辑
我们采用的是二叉树的前序遍历,即中左右。
我们将根结点就放进path中,递归遍历左子树,将左子树的结点值放入path中,继续递归遍历,遍历到叶子节点,收获结果。然后将最近一次放进path中的结点值拿出,然后递归遍历右结点,持续进行下去。最后返回result即可。
/**
* 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:
void treval(TreeNode* root,vector&path,vector&result)
{
path.push_back(root->val);
if(root->left==NULL&&root->right==NULL)
{
string str;
for(int i = 0;i";
}
str += to_string(path[path.size()-1]);
result.push_back(str);
return;
}
if(root->left)
{
treval(root->left,path,result);
path.pop_back();
}
if(root->right)
{
treval(root->right,path,result);
path.pop_back();
}
}
vector binaryTreePaths(TreeNode* root) {
vectorpath;
vectorresult;
if(root==NULL) return result;
treval(root,path,result);
return result;
}
};
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
提示:
[1, 1000]
范围内-1000 <= Node.val <= 1000
这道二叉树的题目要求左叶子之和,我们可以采用后序遍历,即左右中,遍历找到左叶子后向上返回即可。
递归三部曲:
第一部:确定函数返回值和参数
int upret(TreeNode*root)
第二部:确定递归终止条件
if(root==NULL) return 0;
if(root->left==NULL&&root->right==NULL) return 0;
if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL)
{
sum= root->left->val;
}
第三部:写出一次递归的逻辑
/**
* 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 upret(TreeNode*root)
{
int sum = 0;
if(root==NULL) return 0;
if(root->left==NULL&&root->right==NULL) return 0;
if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL)
{
sum+= root->left->val;
}
int le = upret(root->left);
int ri = upret(root->right);
sum += le+ri;
return sum;
}
int sumOfLeftLeaves(TreeNode* root) {
return upret(root);
}
};
还有很多瑕疵,还需继续坚持!