【深入理解二叉树OJ题】

这篇具有很好参考价值的文章主要介绍了【深入理解二叉树OJ题】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、单值二叉树

航班直达!

【深入理解二叉树OJ题】

前序遍历的思想。

思路:先判断左右节点是否存在,再判断根分别和左右节点的值是
否相等。

1.如果左子节点存在,但是值不等于根节点的值,返回false
2.如果右子节点存在,但是值不等于根节点的值,返回false

如果相等,递归其左子节点和右子节点。

不拿如果子节点的值等于根节点的值这个条件来判断的原因是:

就算子节点的值和根节点的相等,也不能代表什么,因为还需要判断下一层子节点的值都与它们的根节点的值相等才行,这样才能达到判断整棵树的值都相等的效果。

即:先判断结构,再判断值

注意:如果根节点为空,返回true,特殊情况特殊处理。

//思路:前序遍历的思想,根先与左右比较,如果不同,直接返回假
//再让左子树与左子树的左右子树比较,这样分治下去

bool isUnivalTree(struct TreeNode* root)
{
    //空树返回真,因为最后叶子节点的左右子树都为空
    if(root == NULL)
    {
        return true;
    }

    //两个不能写反了,先判断是否为空再比较数据
    if(root->left!=NULL && root->left->val != root->val)
    {
        return false;
    }

    if(root->right!=NULL && root->right->val != root->val)
    {
        return false;
    }

    return isUnivalTree(root->left) 
    && isUnivalTree(root->right);

}

二、二叉树最大深度

航班直达!
【深入理解二叉树OJ题】

思路:分别递归根节点的左子节点和右子节点,每次递归一层就计算一层深度,然后比较左右子节点的高度,让大的值+1,(+1是加根节点自己的高度)
【深入理解二叉树OJ题】

//思路:前序遍历的思想+分治算法
//把整棵树看作根左子树右子树组成,先计算左子树的高度和右子树的高度,
//比较之后,大的再加上自己的高度
//左子树又让左子树的左右子树比较高度
int maxDepth(struct TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    //注意:千万不能写成:
    //return maxDepth(root->left)>maxDepth(root->right)?maxDepth(root->left)+1:maxDepth(root->right)+1;
    //这样写虽然能通过,但是效率大大降低,因为同样的事情重复了好多次
    
    int lheight = maxDepth(root->left);
    int rheight = maxDepth(root->right);
    return lheight>rheight?lheight+1:rheight+1;

}

三、翻转二叉树

航班直达!
【深入理解二叉树OJ题】

思路:后序遍历的思想,先从最底层开始交换:

root->left = right,root->right = left

如果递归到叶子节点了,该叶子节点的左右子树都为NULL,交换它们结果是一样的

所以最底层交换完了,回到上一层,左子树交换完了,到右子树,最后返回根节点即可

//思路:后序遍历的思想,先从最底层开始交换:
//root->left = right,root->right = left
//如果递归到叶子节点了,该叶子节点的左右子树都为NULL,交换它们结果是一样的
//所以最底层交换完了,回到上一层,左子树交换完了,到右子树,最后返回根节点即可
struct TreeNode* invertTree(struct TreeNode* root)
{
    if(root == NULL)
    {
        return NULL;
    }
    struct TreeNode*left = invertTree(root->left);

    struct TreeNode*right = invertTree(root->right);

    root->left = right;
    root->right = left;

    return root;
}

四、检查两棵树是否相同

航班直达!

【深入理解二叉树OJ题】

思路:最好是前序遍历:只要从根节点开始,有一个节点的结构不相同,或者值不相同,都返回假

先判断结构,再判断值

判断值的时候,如果值为真,也没有什么意义,因为还需要不断往下比较

所以应该判断值为假,返回false比较合适

//思路:最好是前序遍历:只要从根节点开始,有一个节点的结构不相同,或者值不相同,都返回假
//先判断结构,再判断值
//判断值的时候,如果值为真,也没有什么意义,因为还需要不断往下比较
//所以应该判断值为假,返回false比较合适
bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    //1.先判断结构
    //两个都是空树,返回真
    if(p == NULL && q == NULL)
    {
        return true;
    }
    //来到这里,必有一假,其中一个是空树,返回假
    if(p == NULL || q == NULL)
    {
        return false;
    }
    //2.结构判断完了,判断值
    if(p->val!= q->val )
    {
        return false;
    }
    return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

五、对称二叉树

航班直达!
【深入理解二叉树OJ题】

思路:根节点无需判断,应该写一个函数单独判断两颗子树是否对称的问题

对称问题其实就是判断两颗子树是否相同问题的变形,判断两颗子树是否相同,就是递归两个子树的左和左,右和右,

判断两颗子树是否对称,是递归两个子树的左和右,右和左

先判断结构对称,再判断数据对称

bool isSymmetricalBinaryTree(struct TreeNode* l,struct TreeNode* r)
{
    //两个都为空
    if(!l && !r)
    {
        return true;
    }
    //其中一个为空
    if(l == NULL || r == NULL)
    {
        return false;
    }
    //都不为空
    if(l->val!=r->val)
    {
        return false;
    }

    return isSymmetricalBinaryTree(l->left,r->right) &&isSymmetricalBinaryTree(l->right,r->left); 
    
}
bool isSymmetric(struct TreeNode* root)
{
    //题目说了不是空树
    // if(root == NULL)
    // {
    //     return true;
    // }
    return isSymmetricalBinaryTree(root->left,root->right);
}

六、二叉树遍历

航班直达!

【深入理解二叉树OJ题】

这道题是IO型,需要完全实现输入输出。
思路:按照题目要求,按前序遍历的思想建立一棵树。
然后以中序遍历打印出来,注意:打印完后需要销毁树。文章来源地址https://www.toymoban.com/news/detail-416932.html

#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef char BTDataType;
struct BTNode
{
    struct BTNode*left;
    struct BTNode*right;
    BTDataType data;
};

struct BTNode* CreatTree(BTDataType*a,int *pi)
{
    //(*pi)++不能放在判断这里++,要放在里面,因为如果a[*pi]不为'#',也一样++了,到下面pi这里就++两次了。
    if(a[(*pi)] =='#')
    {
        (*pi)++;
        return NULL;
    }
    struct BTNode*root = (struct BTNode*)malloc(sizeof(struct BTNode));
    assert(root!=NULL);
    root->data = a[(*pi)++];
    root->left = CreatTree(a,pi);
    root->right = CreatTree(a,pi);
    return root;
}

void InOrder(struct BTNode*root)
{
    if(root == NULL)
    {
        return ;
    }
    InOrder(root->left);
    printf("%c ",root->data);
    InOrder(root->right);
}

void BTDestroy(struct BTNode*root)
{
    if(root == NULL)
    {
        return ;
    }
    BTDestroy(root->left);
    BTDestroy(root->right);
    free(root);
    //置空没效果
    root = NULL;
}

int main() {
    BTDataType a[100];
    scanf("%s",a);
    int i =0;
    struct BTNode*root = CreatTree(a,&i);
    InOrder(root);
    BTDestroy(root);
    root = NULL;
    return 0;

}

到了这里,关于【深入理解二叉树OJ题】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

    各位CSDN的uu们你们好呀,今天继续数据结构与算法专栏中的二叉树,下面,让我们进入二叉树的世界吧!!! 二叉树(上)——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 二叉树链式结构的实现 二叉树链式结构的实现 求二叉树的高度 但是这种写法有很大的问题

    2024年02月17日
    浏览(29)
  • 【深入理解二叉树OJ题】

    航班直达! 前序遍历的思想。 思路:先判断左右节点是否存在,再判断根分别和左右节点的值是 否相等。 1.如果左子节点存在,但是值不等于根节点的值,返回false 2.如果右子节点存在,但是值不等于根节点的值,返回false 如果相等,递归其左子节点和右子节点。 不拿如果

    2023年04月18日
    浏览(28)
  • 二叉树OJ题目合集(单值、对称、平衡、构建加遍历)

    目录 前言: 一:单值二叉树 二:二叉树遍历 核心点 (1)前序 (2)中序 (3)后序 三:判断两颗树是否相同 四:判断二叉树是否对称 五:判断一颗树是否为另一颗树的子树 六:平衡二叉树 七:二叉树的构建加遍历 这一部分适合已经 适用于已经掌握二叉树基础的同学(遍历,求节

    2024年02月02日
    浏览(27)
  • 深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

    二叉树(1): 深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 二叉树(2): 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度-CSDN博客 前言: 在前面我们讲了堆及其应用,帮助我们初步了解了二叉树的一些原理,但那与真正的二叉树仍有不同,

    2024年04月09日
    浏览(39)
  • 深入理解数据结构第一弹——二叉树(1)——堆

    前言: 在前面我们已经学习了数据结构的基础操作:顺序表和链表及其相关内容,今天我们来学一点有些难度的知识—— 数据结构中的二叉树 ,今天我们先来学习 二叉树中堆 的知识,这部分内容还是非常有意思的,下面我们就开始慢慢学习 准备工作:本人习惯将文件放在

    2024年04月17日
    浏览(32)
  • 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度

    看这篇前请先把我上一篇了解一下:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 前言: 相信很多学习数据结构的人,都会遇到一种情况,就是明明最一开始学习就学习了时间复杂度,但是在后期自己写的程序或者是做到哪个需要判断时间复杂度的题时,仍然判

    2024年04月09日
    浏览(33)
  • 力扣---二叉树OJ题(多种题型二叉树)

    👧 个人主页 :@小沈熬夜秃头中୧⍤⃝❅ 😚 小编介绍 :欢迎来到我的乱七八糟小星球🌝 📋 专栏 :力扣—LeetCode刷题 🔑 本章内容 :力扣—二叉树OJ题 送给各位 💌:活着就意味着要必须做点什么 请好好努力 欢迎 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇

    2024年02月07日
    浏览(29)
  • 二叉树OJ题:LeetCode--226.翻转二叉树

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第226道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏: 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通 LeetCo

    2024年02月11日
    浏览(32)
  • 二叉树OJ题:LeetCode--101.对称二叉树

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第144道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏: 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通 LeetCo

    2024年02月13日
    浏览(34)
  • 二叉树OJ题:LeetCode--104.二叉树的最大深度

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第104道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏: 数据结构与算法 个  人  主  页  : stackY、 C 语 言 专 栏 : C语言:从入门到精通  Leet

    2024年02月11日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包