刷爆leetcode第九期

题目一 单值二叉树

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

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

题目图片如下

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

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

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

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

我们首先写出以下代码

bool isUnivalTree(struct TreeNode* root) {
    if(root==NULL)
    {
        return true;
    }
    if(root->left&&root->left->val!=root->val)
    {
        return false;
    }

我们来看这里

第二个判断条件中

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

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

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

所以说我们这么写

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

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

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

代码表示如下

bool isUnivalTree(struct TreeNode* root) {
    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);
}

 

题目二 二叉树的前序遍历

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

题目图如下

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

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

但是这里要注意的有两点

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

这个很简单 直接贴代码

 int TreeSize(struct TreeNode* root)
 {
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }

第二点 关于递归的问题

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

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

 // 判断二叉树有多少节点
    *returnSize = TreeSize(root);
    //开辟动态内存并且设立i作为数组下标
    int*a = (int*)malloc(*returnSize*sizeof(int));
    int i = 0;

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

而且会重置i的值

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

 int TreeSize(struct TreeNode* root)
 {
    return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
 }
void preorder(struct TreeNode* root,int* a,int* pi)
{
    if(root==NULL)
    {
        return ;
    }
    a[(*pi)++] = root->val;
    preorder(root->left,a,pi);
    preorder(root->right,a,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
   // 判断二叉树有多少节点
    *returnSize = TreeSize(root);
    //开辟动态内存并且设立i作为数组下标
    int*a = (int*)malloc(*returnSize*sizeof(int));
    int i = 0;
    
    preorder(root,a,&i);
    return a;
}

我们来测试下代码

可以运行

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值