完全二叉树的节点个数
方法一:可以用递归法遍历一遍左子树和右子树的个数之和再加1等于全部节点个数
class Solution {
public:
int getcount(TreeNode* cur)
{
if(cur==NULL) return 0;
int leftcount = getcount(cur->left);
int rightcount = getcount(cur->right);
return leftcount + rightcount + 1;
}
int countNodes(TreeNode* root) {
return getcount(root);
}
};
//写法2:
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL) return 0;
int leftCount = countNodes(root->left);
int rightCount = countNodes(root->right);
return leftCount + rightCount + 1;
}
};
方法二:用层序遍历方式遍历一遍所有节点
class Solution {
public:
int countNodes(TreeNode* root) {
queue<TreeNode*>que;
if(root==NULL) return 0;
que.push(root);
int count = 0;
while(!que.empty())
{
int size = que.size();
for(int i=0; i<size; i++)
{
TreeNode* node = que.front();
que.pop();
count++;
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return count;
}
};
平衡二叉树
判断左子树和右子树是不是高度相差1,用-1来表示不是平衡二叉树
用递归遍历的方式来解决
class Solution {
public:
int getHeight(TreeNode* cur)
{
if(cur==NULL) return 0;
int leftHeight = getHeight(cur->left);
if(leftHeight==-1) return -1;
int rightHeight = getHeight(cur->right);
if(rightHeight==-1) return -1;
return abs(leftHeight-rightHeight) > 1 ? -1 : max(leftHeight,rightHeight)+1;
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
我可以去掉max(leftHeight,rightHeight)吗???
在当前代码逻辑中,max(leftHeight, rightHeight) + 1 这部分是必须的,不能去掉。这是因为:
计算树的高度:max(leftHeight, rightHeight) + 1 的目的是计算当前节点的高度。这是标准的递归方式,左右子树的高度最大值加1,代表了当前节点的高度。如果去掉这部分,函数将无法正确计算树的高度,这会影响到是否平衡的判断。
递归的基础:在递归过程中,每个节点的高度依赖于它的左右子树的高度。max(leftHeight, rightHeight) + 1 确保了递归向上传播时,每层都能正确反映子树的高度,从而可以正确判断平衡性。
平衡判断依赖高度:代码依赖高度差来判断平衡性。虽然直接的平衡判断是通过 abs(leftHeight - rightHeight) > 1 来实现的,但整体高度的递归更新依赖 max(leftHeight, rightHeight) + 1。如果去掉这部分,无法准确获取节点的高度差,从而影响对平衡性的判断。
总结来说,max(leftHeight, rightHeight) + 1 是递归计算高度和判断平衡性的一部分,去掉它会导致无法正确计算节点高度,也就无法正确判断树是否平衡。因此,这部分代码是必须保留的。
二叉树的所有路径
左叶子之和
- 递归方法
通过叶子节点的父节点来访问叶子节点
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);
return leftValue + rightValue;
}
};
- 层序遍历
依然是遍历每一个节点,并用父节点来判断左节点是否为叶子节点
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
queue<TreeNode*>que;
if(root==NULL) return 0;
que.push(root);
int sum = 0;
while(!que.empty())
{
int size = que.size();
while(size--)
{
TreeNode* node = que.front();
que.pop();
if(node->left && !node->left->left && !node->left->right)
{
sum+=node->left->val;
}
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return sum;
}
};