代码随想录刷题-Day17-二叉树
leetcode-110.平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
使用前序遍历方法递归,智能遍历节点的左深度与右深度差异,无法应对右分支有左节点作为结尾的情况,导致部分用例不过
void travel_left(struct TreeNode *root, int *count){
if(root==NULL||count ==NULL)
return;
(*count)++;
travel_left(root->left, count);
return;
}
void travel_right(struct TreeNode *root, int *count){
if(root==NULL||count ==NULL)
return;
(*count)++;
travel_right(root->right, count);
return;
}
bool isBalanced(struct TreeNode* root){
int *left=(int *)malloc(sizeof(int));
int *right=(int *)malloc(sizeof(int));
*left=0, *right=0;
travel_left(root, left);
travel_right(root, right);
if(left==NULL||right==NULL){
return false;
}
if(*left-*right>1||*right-*left>1){
printf("left=%d,right=%d",*left,*right);
return false;
}
return true;
}
正确思路:
新定义一个函数用于计算当前节点的深度;
判断当前节点两子树的深度差是否小于等于1且左子树满足当前判断函数
计算深度的函数:
int hight(struct TreeNode *root){
if(root==NULL)
return 0;
return fmax(hight(root->left), hignt(root->right)) +1;
}
leetcode-257.平衡二叉树
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
leetcode-404.左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。
分别用两个函数遍历左节点和右节点,左处理函数判断是否没有子节点,是则加上val
void trval(struct TreeNode *root, int *num);
void trval_left(struct TreeNode *root, int *num){
if(root==NULL)
return ;
if(num==NULL)
return;
if(root->right==NULL && root->left==NULL){
*num = *num + root->val;
}
trval_left(root->left, num);
trval(root->right, num);
}
void trval(struct TreeNode *root, int *num){
if(root==NULL)
return ;
trval_left(root->left, num);
trval(root->right, num);
}
int sumOfLeftLeaves(struct TreeNode* root){
int *num=(int *)malloc(sizeof(int));
*num=0;
trval(root, num);
if(num==NULL)
return -1;
return *num;
}