【牛客网面试必刷TOP101】二叉树篇(一)

一、前言

二叉树是数据结构中重要的一个章节,他的重要性也不言而喻,在未来不管是笔试还是面试都会遇到这类的题目,所以接下来我就会把一些常考的题目全部整理出来供大家学习指正。


二、学习刷题网站

在这里插入图片描述

点击下面链接即可进行刷题学习
开始刷题

三、刷题

先说明一下一些题目取自牛客网面试必刷TOP101
里面的一些题目在我以前的文章详细写到过,如果没有用新的方法就不会再做讲解
LeetCode刷题 —— 手撕二叉树

<1> 二叉树中和为某一值的路径(一)

题目链接
描述

给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n

例如:

给出如下的二叉树,sum=22
在这里插入图片描述
返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22

数据范围:

1.树上的节点数满足0 ≤ n ≤ 10000
2.每 个节点的值都满足0∣val∣ ≤ 1000
要求:空间复杂度O(n),时间复杂度O(n)
进阶:空间复杂度O(树的高度),时间复杂度O(n)

示例1

输入:{5,4,8,1,11,#,9,#,#,2,7},22
返回值:true

示例2

输入:{1,2},0
返回值:false

示例3

输入:{1,2},3
返回值:true

示例4

输入:{},0
返回值:false

思路分析
我们把一条路径上的数值全部加起来判断是否相等很难,所以我们可以换一个思路,递归下去每一个节点让sum-节点值,如果到叶子节点时sum == 0,就返回true,否则返回false。

bool hasPathSum(struct TreeNode* root, int sum ) {
    if(root == NULL)
    {
        return false;
    }
    sum -= root->val;
    if(root->left == NULL && root->right == NULL)
    {
        if(sum == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    return hasPathSum(root->left, sum) || hasPathSum(root->right, sum);
}

<2>合并二叉树

题目链接
描述

已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:
两颗二叉树是:
Tree 1:
在这里插入图片描述
Tree 2:
在这里插入图片描述
合并后的树为
在这里插入图片描述
数据范围:树上节点数量满足0 ≤ n ≤ 500,树上节点的值一定在32位整型范围内。
进阶:空间复杂度O(1),时间复杂度O(n)

示例1

输入:{1,3,2,5},{2,1,3,#,4,#,7}
返回值:{3,4,5,5,4,#,7}
说明:如题面图

示例2

输入:{1},{}
返回值:{1}

思路分析:
分三种情况,如果两个根都到NULL,就返回NULL,如果一个为空,就返回那个不为空的,如果都不为空,则两个数值相加。

struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2 ) {
    if(!t1 && !t2)
    {
        return NULL;
    }
    if(!t1)
    {
        return t2;
    }
    if(!t2)
    {
        return t1;
    }
    t1->val += t2->val;
    t1->left = mergeTrees(t1->left, t2->left);
    t1->right = mergeTrees(t1->right, t2->right);
    return t1;
}

<3> 二叉树的镜像

题目链接
描述

操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数0 ≤ n ≤ 1000 , 二叉树每个节点的值0 ≤ val ≤ 1000
要求: 空间复杂度 O(n)。本题也有原地操作,即空间复杂度 O(1)的解法,时间复杂度 O(n)

比如:

源二叉树
在这里插入图片描述
镜像二叉树
在这里插入图片描述

示例1

输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
说明:如题面所示

示例2

输入:{}
返回值:{}

思路分析
很显然这道题要使用递归,我们直接看最后一步就可以写出代码:
递归到叶子节点的双亲节点,然后交换左右子节点:

struct TreeNode* Mirror(struct TreeNode* root ) {
    if(root == NULL)
    {
        return NULL;
    }
    struct TreeNode* left = Mirror(root->left);
    struct TreeNode* right = Mirror(root->right);
    root->left = right;
    root->right = left;
    return root;
}


三、小结

我们可以看到二叉树基本解题思路就是递归,如果递归想不出代码,可以直接看最后一步怎么实现。

点击链接一起刷题吧



评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命由己造~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值