二叉树相关的简单递归oj

news2024/12/23 1:45:10

二叉树相关的简单递归oj

  • 前言
  • 题目
    • 二叉树的前序遍历
    • 相同的树判断
    • 单值二叉树
    • 对称二叉树
    • 另一棵树的子树
    • 创建二叉树并遍历

前言

这篇博客主要是博主感觉对二叉树oj题目不太熟悉,随便整理的一下题目和解答,方便复习,所以讲题部分主要以我自己以及为我以后便于复习的简便语言来描述,看官可以当作的题目随便刷一下,如果看不懂可以自己画一下递归展开图。

题目

二叉树的前序遍历

oj链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/
在这里插入图片描述
在这里插入图片描述
这道题并不难,难的是给了个参数returnSize
其实这里就是要求,以前序遍历的排列方式,将二叉树的值放入至一个数组中,并且返回数组大小就好。

int CountTreeNode(struct TreeNode* root)
{
    if(root==NULL)
        return 0;
    return 1+CountTreeNode(root->right)+CountTreeNode(root->left);
}
void printTN(struct TreeNode* root,int* i,int* a)
{
    if(root==NULL)
        return;
    a[(*i)]=root->val;
    (*i)++;
    printTN(root->left,i,a);
    printTN(root->right,i,a);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    *returnSize=CountTreeNode(root);
    int* ptr=(int*)malloc(sizeof(int)*(*returnSize));
    int i=0;
    printTN(root,&i,ptr);
    return ptr;
}

相似的还有前序遍历,后序遍历,这里就不放出来了。

相同的树判断

oj链接:https://leetcode.cn/problems/same-tree/
在这里插入图片描述
这个题目不要用遍历的角度去看,虽然实现角度确实是遍历,但是为了方便理解还是用分治方法去思考
让q和p一起去递归,一起走q和p的左子树比较,然后走右子树的比较,如果一样,返回他们对应的布尔值,不一样就返回false。

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
    if(p==NULL&&q==NULL)
        return true;
    if(p==NULL||q==NULL)
        return false;
    if(q->val!=p->val)
        return false;
     return (isSameTree(q->left,p->left)&&isSameTree(q->right,p->right));
}

单值二叉树

oj链接:https://leetcode.cn/problems/univalued-binary-tree/
在这里插入图片描述
这道题让根值与左子树以及右子树的值比较就好,同时要判断左子树和右子树是否为空,然后同时比较返回左子树和右子树的比较值就好。

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

对称二叉树

oj链接:https://leetcode.cn/problems/symmetric-tree/
在这里插入图片描述
这道题很简单

bool issame(struct TreeNode* left,struct TreeNode* right)
{
    if(left==NULL&&right==NULL)
        return true;
    if(left==NULL||right==NULL)
        return false;
    if(left->val!=right->val)
        return false;
    return (issame(left->left,right->right)&&issame(left->right,right->left));
}
bool isSymmetric(struct TreeNode* root)
{
    return issame(root->left,root->right);
}

另一棵树的子树

oj链接:https://leetcode.cn/problems/subtree-of-another-tree/
在这里插入图片描述

这道题递归套递归就好

bool sameTreeNode(struct TreeNode* root,struct TreeNode* subRoot)
{
    if(root==NULL&&subRoot==NULL)
        return true;
    if(root==NULL||subRoot==NULL)
        return false;
    if(root->val!=subRoot->val)
    return false;
    return (sameTreeNode(root->left,subRoot->left)
    &&sameTreeNode(root->right,subRoot->right));
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{
    if(root==NULL)
        return false;
    if(sameTreeNode(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot)
    || isSubtree(root->right,subRoot);
}

创建二叉树并遍历

oj链:https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking

这道题就稍微创建有点难,但而不至于到较难

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

typedef  struct TreeNode
{
    struct TreeNode* left;
    struct TreeNode* right;
    char data;
}TreeNode;
void inOrder(TreeNode* root)
{
    if(root==NULL)
    {
        return;
    }
    inOrder(root->left);
    printf("%c ",root->data);
    inOrder(root->right);        

}
TreeNode* creattree(char* arr,int* y)
{
    if(arr[*y]=='#')
    {
        (*y)++;
        return NULL;
    }
    TreeNode* ptr=(TreeNode*)malloc(sizeof(TreeNode));
    ptr->data=arr[*y];
    (*y)++;
    ptr->left=creattree(arr,y);
    ptr->right=creattree(arr,y);
    return ptr;
}
int main() 
{
    char arr[200];
    int y=0;
    scanf("%s",arr);
    TreeNode* tree=creattree(arr,&y);
    inOrder(tree);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 基础入门篇(二)——— Java 基础语法

文章目录 一、注释二、字面量三、变量3.1 变量概述3.2 变量在计算机中的底层原理 四、数据类型五、关键字、标志符六、类型转换6.1 自动类型转换6.2 表达式的自动类型转换6.3 强制类型转换 七、运算符7.1 基本算数运算符7.2 符号做连接符7.3 自增自减运算符7.4 赋值运算符7.5 …

【C++技能树】类的六个成员函数Ⅰ --构造、析构、拷贝构造函数

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0.this指针1.Class默认成员函数2.构造函数调用规则: 3.析构函数4.拷贝构造函数 0.this指针 在开始本章内容之前&#xff0c;先浅…

Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析

paper&#xff1a;Channel-wise Knowledge Distillation for Dense Prediction official implementation&#xff1a;https://github.com/irfanICMLL/TorchDistiller/tree/main/SemSeg-distill 摘要 之前大多数用于密集预测dense prediction任务的蒸馏方法在空间域spatial…

(求正数数组的最小不可组成和,养兔子)笔试强训

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、选择题1 二、[编程题]养兔子 三、[编程题]求正数数组的最小不可组成和 一、选择题1 reflection是如何工作的__牛客网 (nowcoder.com) 考虑下面这个简单的例子&…

大数据Doris(八):Broker部署和集群启停脚本

文章目录 Broker部署和集群启停脚本 一、Broker部署 1、准备Broker 安装包 2、启动 Broker

PyQt6剑指未来-日期和时间

前言 时间和日期是软件开发中非常重要的概念。在PyQt6中&#xff0c;时间和日期模块提供了处理日期、时间和日期时间的类和函数&#xff0c;以及管理时区和夏令时的特性。这些模块提供了可靠和易于使用的工具&#xff0c;使得在PyQt6中处理和呈现时间和日期的操作变得轻松起来…

Java中Lambda表达式(初学到精通)

目录 一、Lambda表达式是什么&#xff1f;什么场景下使用Lambda&#xff1f; 1.Lambda 表达式是什么 2.函数式接口是什么 第二章、怎么用Lambda 1.必须有一个函数式接口 2.省略规则 3.Lambda经常用来和匿名内部类比较 第三章、具体使用举例&#xff08;&#xff09; 1.案…

跳跃游戏类题目 总结篇

一.跳跃游戏类题目简单介绍 跳跃游戏是一种典型的算法题目&#xff0c;经常是给定一数组arr&#xff0c;从数组的某一位置i出发&#xff0c;根据一定的跳跃规则&#xff0c;比如从i位置能跳arr[i]步&#xff0c;或者小于arr[i]步&#xff0c;或者固定步数&#xff0c;直到到达某…

C++ 链表概述

背景 当需要存储大量数据并需要对其进行操作时&#xff0c;常常需要使用到链表这种数据结构。它可以用来存储一系列的元素并支持插入、删除、遍历等操作。 概念 一般来说&#xff0c;链表是由若干个节点组成的&#xff0c;每个节点包含了两个部分的内容&#xff1a;存储的数…

【嵌入式环境下linux内核及驱动学习笔记-(6-内核 I/O)-阻塞与非阻塞】

目录 1、阻塞与非阻塞1.1 以对recvfrom函数的调用及执行过程来说明阻塞的操作。1.2 以对recvfrom函数的不断轮询调用为例&#xff0c;说明非阻塞时进程的行为。1.3 简单介绍内核链表及等待队列1.4 等待队列1.4.1 定义等待队列头部&#xff08;wait_queue_head_t&#xff09;1.4…

vue动态添加多组数据添加正则限制

如图新增多条数据&#xff0c;如果删除其中一条正则校验失败的数据&#xff0c;提示不会随之删除&#xff0c;若想提示删除并不清空数据 delete (item, index) {this.applicationForm.reserveInfo.forEach((v, i) > {if (i index) {this.$refs.formValidate.fields.forEac…

UFT——操作模块

示例一 创建一个可重复利用的登录测试更改Action的名称。使用本地数据表。创建一个主调用测试。建立测试迭代。处理缺失的Action。 分析&#xff1a;就是创建一个只有登录的测试起名为login&#xff0c;然后在创建一个主测试起名字比如main&#xff0c;在main中&#xff0c;调用…

微信小程序定义模板

微信小程序提供模板&#xff08;template&#xff09;功能&#xff0c;把一些可以共用的&#xff0c;复用的代码在模板中定义为代码片段&#xff0c;然后在不同的地方调用&#xff0c;可以实现一次编写&#xff0c;多次引用的效果。 首先我们看一下官网是如何操作的 一般的情…

笔记:对多维torch进行任意维度的多“行”操作

如何取出多维torch指定维度的指定“行” 从二维torch开始新建torch取出某一行取出某一列一次性取出多行取出连续的多行取出不连续的多行 一次取出多列取出连续的多列取出不连续的多列 考虑三维torch取出三维torch的任意两行&#xff08;means 在dim0上操作&#xff09;取出连续…

( 字符串) 9. 回文数 ——【Leetcode每日一题】

❓9. 回文数 难度&#xff1a;简单 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如…

Git的安装与使用+Git在IDEA中的使用

文章目录 一、Git概述1、版本控制器的方式2、Git的工作流程图 二、Git的安装与常用命令1、Git环境安装2、Git环境基本配置3、获取本地仓库4、基础操作指令 三、分支1、常用指令2、解决合并冲突 四、Git远程仓库1、创建远程仓库2、远程操作仓库3、冲突处理 四、IDEA中使用Git1、…

数据结构——二叉树

二叉树 1 二叉树的种类 1.1 满二叉树 节点数量为 2^k - 1 (k是树的深度&#xff0c;底层的叶子节点都是满的&#xff09; 1.2 完全二叉树 完全二叉树是指除了下面一层外&#xff0c;其余层的节点都是满的&#xff1b; 且最下面一层的叶子节点是从左到右连续的。 下面这个…

pci总线协议学习笔记——PCI总线基本概念

1、pci总线概述 (1)PCI&#xff0c;外设组件互连标准(Peripheral Component Interconnection)&#xff0c;是一种由英特尔&#xff08;Intel&#xff09;公司1991年推出的用于定义局部总线的标准; (2)最早提出的PCI总线工作在33MHz频率之下&#xff0c;传输带宽达到133MB/s(33M…

【LeetCode】236. 二叉树的最近公共祖先

1.问题 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是…