IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 刷爆leetcode第十期 0021~0022 -> 正文阅读

[数据结构与算法]刷爆leetcode第十期 0021~0022

编号0021 单值二叉树

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

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

题目图片如下

在这里插入图片描述

在这里插入图片描述

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

如果相等返回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)

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

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

在这里插入图片描述
代码表示如下

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 ,返回它节点值的 前序 遍历。

题目图如下

在这里插入图片描述
这里结合过我们之前学过的前序遍历

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

但是这里要注意的有两点

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

这个很简单 直接贴代码

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;
}

我们来测试下代码

在这里插入图片描述
咦 我们发现 这里出错了

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

这是为什么呢?

我们检查下代码

终于 我们找到了以下代码

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

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

真正i的值 并没有改变

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

这么这里修改下代码

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

然后
在这里插入图片描述

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

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

那么大家下期再见咯

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:39:02  更:2022-10-22 21:41:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:16:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码