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

各位CSDN的uu们你们好呀,今天继续数据结构与算法专栏中的二叉树,下面,让我们进入二叉树的世界吧!!!


二叉树(上)——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 

二叉树链式结构的实现


二叉树链式结构的实现

求二叉树的高度

//求二叉树的高度
int BTreeHeight(BTNode* root)
{if (root == NULL){return 0;}else{return BTreeHeight(root->left) > BTreeHeight(root->right)? BTreeHeight(root->left) + 1 : BTreeHeight(root->right) + 1;}
}

但是这种写法有很大的问题!!!

下面,我们来看leetcode上面有一个类似的题目。

会发现:这种写法是过不了的!!!

当这棵树特别大的时候,leetcode会提示超出时间限制!!!

下面,我来举一个生动形象的例子

在这张图上,所有的领导都不记事。校长找院长1,院长1找辅导员1,辅导员1找班长1,班长1返回了一个结果给辅导员1,辅导员1又找班长2,班长2也返回了一个结果给辅导员1,但是这个辅导员1只比较了班长1和班长2所返回的结果谁大谁小,并没有把数据记录下来。等到班长2返回完结果之后,辅导员1又再一次找班长1要数据(班长1的数据比较好),班长1又要再一次返回数据结果。现在,辅导员1终于可以把结果返回给院长1了, 然后,院长1开始找辅导员2,辅导员2找班长3,班长3返回结果给辅导员2,辅导员2找班长4,班长4也返回结果给辅导员2,但是辅导员2仍然只是比较了班长3和班长4所返回的数据结果的大小,并没有把数据记录下来,假设班长4的数据比较好,也就是:班长4刚刚把数据报给辅导员2,回到宿舍,辅导员紧接着打了个电话给班长4,要他来汇报数据。现在辅导员2终于把数据汇报给院长1了,但是,这个院长1只比较了辅导员1和辅导员2所返回的数据结果的大小,还是没有记录数据。假设辅导员1的数据比较好,辅导员1又得找两个班长重复上面的过程(关键是辅导员1不记事,再一次比较了班长1和班长2的数据后,又得把班长1叫过去汇报数据)(班长1:我真是栓Q,没完没了了是吧)

这样是非常恐怖的!!!

调用的次数成等比数列(成倍地增加,每一层都是一个叠加的double)

所以,这个题目的最优解是:

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

 

所以求二叉树的高度的源代码:

//求二叉树的高度
int BTreeHeight(BTNode* root)
{if (root == NULL){return 0;}else{int leftHeight = BTreeHeight(root->left);int rightHeight = BTreeHeight(root->right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;}
}

二叉树第k层结点个数

子问题:转换成左子树的第k-1层和右子树的第k-1层

结束条件:k==1且结点不为空

// 二叉树第k层节点个数
int BTreeLevelKSize(BTNode* root, int k)
{assert(k > 0);if (root == NULL)//无论k是多少{return 0;}//root一定不为空if (k == 1){return 1;}//root不为空并且k不为1return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}

 

 

 

 

使用前序比较!!!

二叉树里面不敢轻易使用断言(因为二叉树里面有NULL)

bool isSameTree(struct TreeNode* p, struct TreeNode* q){//两个都为空if(p==NULL&&q==NULL){return true;}//一个为空,另一个不为空if((p==NULL&&q!=NULL)||(p!=NULL&&q==NULL)){return false;}//根不相等if(p->val!=q->val){return false;}return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

 

二叉树查找值为x的结点

使用前序查找!!!        根         左子树        右子树

// 二叉树查找值为x的节点
BTNode* BTreeFind(BTNode* root, BTDataType x)
{if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode* ret1 = BTreeFind(root->left, x);if (ret1){return ret1;}BTNode* ret2 = BTreeFind(root->right, x);if (ret2){return ret2;}return NULL;
}

 

 

 

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

 

 


二叉树的源代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


typedef int BTDataType;
typedef struct BinaryTreeNode
{
    BTDataType data;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
}BTNode;

BTNode* BuyNode(BTDataType x)
{
    BTNode* node = (BTNode*)malloc(sizeof(BTNode));
    if (node == NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    node->data = x;
    node->left = NULL;
    node->right = NULL;
    return node;
}

BTNode* CreatBinaryTree()
{
    BTNode* node1 = BuyNode(1);
    BTNode* node2 = BuyNode(2);
    BTNode* node3 = BuyNode(3);
    BTNode* node4 = BuyNode(4);
    BTNode* node5 = BuyNode(5);
    BTNode* node6 = BuyNode(6);

    node1->left = node2;
    node1->right = node4;
    node2->left = node3;
    node4->left = node5;
    node4->right = node6;
    return node1;
}


//求二叉树的高度
int BTreeHeight(BTNode* root)
{
    if (root == NULL)
    {
        return 0;
    }
    else
    {
        int leftHeight = BTreeHeight(root->left);
        int rightHeight = BTreeHeight(root->right);
        return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
    }
}


// 二叉树第k层节点个数
int BTreeLevelKSize(BTNode* root, int k)
{
    assert(k > 0);
    if (root == NULL)//无论k是多少
    {
        return 0;
    }
    //root一定不为空
    if (k == 1)
    {
        return 1;
    }
    //root不为空并且k不为1
    return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}


// 二叉树查找值为x的节点
BTNode* BTreeFind(BTNode* root, BTDataType x)
{
    if (root == NULL)
    {
        return NULL;
    }
    if (root->data == x)
    {
        return root;
    }
    BTNode* ret1 = BTreeFind(root->left, x);
    if (ret1)
    {
        return ret1;
    }
    BTNode* ret2 = BTreeFind(root->right, x);
    if (ret2)
    {
        return ret2;
    }
    return NULL;
}

int main()
{

    printf("BTreeHeight:%d\n", BTreeHeight(root));

    printf("BTreeLevelKSize:%d\n", BTreeLevelKSize(root, 3));

    printf("BTreeFind:%p\n", BTreeFind(root, 3));

    return 0;
}

 


好啦,小雅兰今天的内容就到这里啦,还要继续加油呀!!!

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28776.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK报错no handler found for uri and method [PUT] 原因

执行后提示no handler found for uri and method post&#xff0c;最新版8.2的问题&#xff1f; 原因&#xff1a; index.mapping.single_type: true在索引上 设置将启用按索引的单一类型行为&#xff0c;该行为将在6.0后强制执行。 原 {type} 要改为 _doc&#xff0c;格式如…

[游戏开发][Unity] TPS射击游戏相机实现

技术难点&#xff1a;由于是第三人称射击游戏&#xff0c;角色和相机之间有夹角&#xff0c;所以枪口点和准星是有误差的&#xff0c;下面是和平精英手游截图&#xff0c;我用AK射击zhuzi using System.Collections; using System.Collections.Generic; using UnityEngine;publ…

需求条目化与自动估算强强联合 助力软件估算自动化

痛点&#xff1a; 需求是产品的源头&#xff0c;是项目规模估算的基石。而传统的软件规模估算是由项目成员手工进行&#xff0c;对人员能力、经验、方法都有一定的要求&#xff0c;但是效果不好而且耗时费力&#xff0c;不能保持规模估算的一致性。 而导致这些问题的原因&#…

IDDR和ODDR

IDDR D&#xff1a;输入双倍速率数据&#xff08;IOB输入&#xff0c;且数据在时钟的上升沿和下降沿都会发生切换&#xff0c;即一个时钟周期发送2bit数据&#xff09; CE&#xff1a;时钟使能信号&#xff08;高有效&#xff09; C&#xff1a;时钟信号 S&#xff0c;R&#x…

微服务sleuth+zipkin---链路追踪+nacos配置中心

目录 1.分布式链路追踪 1.1.链路追踪Sleuth介绍 1.2.如何完成sleuth 1.3.zipkin服务器 2.配置中心 2.1.常见配置中心组件 2.2.微服务集群共享一个配置文件 2.2.1实时刷新--配置中心数据 2.2.2.手动写一个实时刷新的配置类 ----刷新配置文件 2.3.多个微服务公用一个配…

Nginx学习之一撸到底

一、Nginx环境搭建 ❶首先创建Nginx的目录并进入&#xff1a; [rootlocalhost]# mkdir /soft && mkdir /soft/nginx/ [rootlocalhost]# cd /soft/nginx/ ❷下载Nginx的安装包&#xff0c;可以通过FTP工具上传离线环境包&#xff0c;也可通过wget命令在线获取安装包…

有序链表转换二叉搜索树

给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,nul…

自定义view(一)----自定义TextView

自定义view也算是Android的一大难点&#xff0c;里面涉及到很多值得学习的地方&#xff0c;我会在接下来写一系列文章去介绍它&#xff0c;本篇文章以自定义一个TextView为例。 View的构造方法 自定义view之前我们先了解view的四个构造方法&#xff0c;自定义view无非就是新建一…

如何通过边缘智能网关实现暴雨灾害监测预警

随着台风季来临&#xff0c;暴雨灾害也进入到频发阶段&#xff0c;给村镇和城市居民都造成诸多人身和财产损失。针对南方台风季的水灾防治&#xff0c;物联网技术派上大用场&#xff0c;本篇就基于边缘智能网关的数采方案&#xff0c;简单介绍对暴雨导致的洪涝、内涝的监测和预…

解放研究者:GPT自动化科研

GPT Researcher 是一个自主代理程序&#xff0c;旨在进行多种任务的全面在线研究。 该代理能够生成详细、事实性和公正的研究报告&#xff0c;并提供个性化选项&#xff0c;以便关注相关资源、大纲和教训。受到AutoGPT和最近的Plan-and-Solve论文的启发&#xff0c;GPT Researc…

Revit防护栏怎么做?用栏杆族实现

​  做一些公路类似的项目&#xff0c;要做一些防护栏&#xff0c;我们该怎么做? 今天分享一下&#xff0c;如何造型及方便的去放置。我们都知道栏杆族的特性是可以沿线放置&#xff0c;那么好办。在了解了一些族特性后&#xff0c;我们就可以根据这些特性来做些文章。 第一…

FiddlerScript修改指定参数的返回值

FiddlerScript修改指定参数的返回值 使用场景&#xff1a; api/Live/GetLiveList接口&#xff1a; &#xff08;1&#xff09;Type为1&#xff0c;接口返回直播列表 &#xff08;2&#xff09;Type为2&#xff0c;接口返回回放列表 现在想修改直播列表的返回值 思路&#…