刷爆leetcode第十期 0021~0022

简介: 刷爆leetcode第十期 0021~0022

编号0021 单值二叉树


如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。


只有给定的树是单值二叉树时,才返回 true;否则返回 false。


题目图片如下


6c45fe066ed74182b2befa774dd8d303.png53b5efa163bd49ca8b845e1b474e9b52.png




我们这里主要是判断下 根的值和它的左孩子还有右孩子相不相等


如果相等返回true 如果不相等返回false


(当然这里还需要考虑一个问题 就是左右孩子可能为空的问题 )


当左右孩子为空的时候 返回true


我们首先写出以下代码


    // 如果root为空就直接返回ture
    if(root==NULL)
    {
        return true;
    }
    //后面判断不相等的条件 因为判断相等的条件要判断多次
    if(root->left && root->left->val == root ->val)
    {
    }


我们来看这里


第二个判断条件中


如果左值不为空 且左值等于右值


这个时候能判断是真还是假了嘛?


显然不能 这时候还需要判断右值 还需要判断空的情况


所以说我们这么写


if(root->left && root->left->val != root ->val)

这样子写 如果这个条件成立的话就可以直接返回假了


接下来只要再判断下右边值还有后面的就可以


15f5cb6e5afd4974acdf234a69f72786.png


代码表示如下


bool isUnivalTree(struct TreeNode* root)
{
    // 如果root为空就直接返回ture
    if(root==NULL)
    {
        return true;
    }
    //后面判断不相等的条件 因为判断相等的条件要判断多次
    if(root->left && root->left->val != root->val)
    {
        return false;
    }
    if(root->right && root->right->val != root->val)
    {
        return false;
    }
    //判断完根之后再判断它的左值右值 
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}


编号0022 二叉树的前序遍历


给你二叉树的根节点 root ,返回它节点值的 前序 遍历。


题目图如下


aeba0ab3c0664462a3b998d8428989aa.png

这里结合过我们之前学过的前序遍历


它其实是一个很简单的问题


但是这里要注意的有两点


第一点 关于开辟动态内存大小的问题 我们可以先算出二叉树节点的个数


这个很简单 直接贴代码


int  size(struct TreeNode* root)
{
    //先看边界条件
    if(root==NULL)
    {
        return 0;
    }
    // 接下来递归下面的值
    return size(root->left)+ size(root->right)+1;
}


第二点 关于递归的问题


这里我们不能在主函数中递归


我们来看看主函数中设定了哪些值


int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    // 判断二叉树有多少节点
    int size1 = size(root);
    //开辟动态内存并且设立i作为数组下标
    int* arr = (int* )malloc(sizeof(int)*size1);
    int i = 0;


如果在主函数中递归的话 那么就会不断的开辟新的动态内存导致错误


而且会重置i的值


好了 我们写完的代码全部表示如下


/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int  size(struct TreeNode* root)
{
    //先看边界条件
    if(root==NULL)
    {
        return 0;
    }
    // 接下来递归下面的值
    return size(root->left)+ size(root->right)+1;
}
void _preorderTraversal(struct TreeNode* root, int* arr , int i )
{
    //开始前序遍历 
    if(root==NULL)
    {
        return ;
    }
    arr[i++] = root->val;
    // 遍历左子树和右子树
    _preorderTraversal(root->left,arr,i);
    _preorderTraversal(root->right,arr,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    // 判断二叉树有多少节点
    int size1 = size(root);
    //开辟动态内存并且设立i作为数组下标
    int* arr = (int* )malloc(sizeof(int)*size1);
    int i = 0;
    // 因为我们在主函数里面不可以递归调用 这样会开始很多个a数组的空间 
    _preorderTraversal(root,arr,i);
    //设定返回值
    //printf("%d",size1);
    *returnSize = size1;
    return arr;
}


我们来测试下代码


9aa95a3813654d5895eb54488b332e17.png


咦 我们发现 这里出错了


最后面一个数是随机值!!


这是为什么呢?


我们检查下代码


终于 我们找到了以下代码


void _preorderTraversal(struct TreeNode* root, int* arr , int i )


我们这里传递的i是一个值 再经过递归之后实际上是拷贝了一份i的值


真正i的值 并没有改变


上面之所以没有问题的原因是因为二叉树是一颗单边树 它只有左边或者只有右边


这么这里修改下代码


将所有的传值调用都改成传址调用


然后

88758da207d443d7ae6ede1c54c6ac70.png


以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够


不吝赐教 在评论区或者私信指正 博主一定及时修正


那么大家下期再见咯


相关文章
|
5月前
刷爆leetcode第一期
刷爆leetcode第一期
22 1
|
5月前
刷爆leetcode第八期
刷爆leetcode第八期
15 0
|
5月前
刷爆leetcode第六期
刷爆leetcode第六期
18 0
|
5月前
|
测试技术 C语言
刷爆leetcode第五期
刷爆leetcode第五期
22 0
|
5月前
刷爆leetcode第七期
刷爆leetcode第七期
20 0
|
5月前
|
索引
刷爆leetcode第四期
刷爆leetcode第四期
17 0
|
5月前
刷爆leetcode第二期
刷爆leetcode第二期
26 0
|
5月前
|
索引
刷爆leetcode第三期
刷爆leetcode第三期
24 0
|
Cloud Native
【刷题日记】1037. 有效的回旋镖
本次刷题日记的第 58 篇,力扣题为:1037. 有效的回旋镖,简单
【刷题日记】1037. 有效的回旋镖