首页 > 其他分享 >力扣刷题:二叉树OJ篇(下)

力扣刷题:二叉树OJ篇(下)

时间:2025-01-07 17:58:04浏览次数:11  
标签:right return struct 力扣 二叉树 TreeNode left root OJ

大家好,这里是小编的博客频道
小编的博客:就爱学编程

很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!

目录

在这里插入图片描述


废话不多说,我们直接看题。

1.

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

首先我们需要了解什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

定义 preorder(root) 表示当前遍历到 root 节点的答案。按照定义,我们只要首先将 root 节点的值加入答案,然后递归调用 preorder(root.left) 来遍历 root 节点的左子树,最后递归调用 preorder(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。

代码实现:

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);
    int* a = (int*)malloc(sizeof(int) * (*returnSize));
    assert(a);
    int i = 0;
    preorder(root, a, &i);
    return a;
}

2.对称二叉树

(1)题目描述

在这里插入图片描述


(2)解题思路

如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?

如果同时满足下面的条件,两个树互为镜像:

  • 它们的两个根结点具有相同的值
  • 每个树的右子树都与另一个树的左子树镜像对称

代码实现:

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

bool isSymmetric(struct TreeNode* root) {
        return check(root->left, root->right);
}

3.另一棵树的子树

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

深度优先搜索枚举 s 中的每一个节点,判断这个点的子树是否和 t 相等。如何判断一个节点的子树是否和 t 相等呢,我们又需要做一次深度优先搜索来检查,即让两个指针一开始先指向该节点和 t 的根,然后「同步移动」两根指针来「同步遍历」这两棵树,判断对应位置是否相等。

代买实现:

//判断两棵树是否相同
 bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL) return true;
    if((p == NULL || q == NULL) || (p->val != q->val)) return false; 
    else return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

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

4.二叉树的构建及遍历

(1)题目描述

在这里插入图片描述
在这里插入图片描述


(2)解题思路

根据题目的要求来即可

代码实现:

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

typedef struct TreeNode{
    struct TreeNode* left;
    struct TreeNode* right;
    char val;
}TR;

//建树
TR* CreateTreeNode(char* arr, size_t* pi){
    if(arr[*pi] == '#') 
    {
        ++(*pi);
        return NULL;
    }
    
    TR* root = (TR*)malloc(sizeof(TR));
    root->val = arr[*pi];
    ++(*pi);
    root->left = CreateTreeNode(arr, pi);
    root->right = CreateTreeNode(arr, pi);
    return root;
}

//中序遍历
void InOrder(TR* root){
    if(root == NULL) return;
    InOrder(root->left);
    printf("%c ", root->val);
    InOrder(root->right);
}

int main() {
    char arr[100];
    scanf("%s", arr);
   
    //建树
    size_t i = 0;
    TR* root =  CreateTreeNode(arr, &i);

    //中序遍历
    InOrder(root);
    return 0;
}

快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对你有帮助的话不要忘了,记得给小编点赞、收藏支持一下,在此非常感谢!!!

标签:right,return,struct,力扣,二叉树,TreeNode,left,root,OJ
From: https://blog.csdn.net/z15879084549/article/details/144990117

相关文章

  • 海贼OJ #251. 士兵 题解 排序+中位数(数学思维题)
    题目链接:https://oj.haizeix.com/problem/251解题思路:最短总距离是所有点到中位数的距离之和。对\(y\):排序求中位数。对\(x\):对\(x\)排序,然后对排序后的\(x_i-i\)排序,然后求最短距离。对\(x_i-i\)进行处理,能保证最终的\(x_i\)各不一样且相邻。示例程序:#inclu......
  • CS61B srping 2018 proj1A https://sp18.datastructur.es/
    proj1A数据结构skeleton地址开始这个proj之前,至少应该对SLList,DLList,AList有所了解介绍在proj1A里要用list和Array来创建“DoubleEndedQueue”,在接下来的proj1B里要对应编写测试。LinkedListDeque.javaandArrayDeque.java是这个proj里边要操作的文件,推荐使用intel......
  • [题目记录]loj#560 Menci的序列
    loj#560Menci的序列题意给出一个长为\(n\),由+和*组成的序列和常数\(k\).对于一个这样的序列,定义其权值为:初始权值为0,从左到右遍历序列如果当前位是+就把权值\(+1\)如果当前位是*就把权值\(\times2\)对\(2^k\)取模.求原序列的一个子序列,......
  • 算法基础 -二叉树遍历
    文章目录1.二叉树概念2.层序遍历2.1.复杂度2.2.示例12.3.示例23.层次遍历23.1.层次遍历规则3.2.层次遍历举例3.3.层次遍历代码4.先序遍历4.1.先序遍历规则4.2.先序遍历举例4.3.先序遍历代码(递归)4.4.先序遍历代码(非递归)5.中序遍历5.1.中序遍历规则5.2.......
  • 信奥OJ的搭建
    第一步,服务器申请选择一:免费云服务器,免费虚拟主机如:阿贝云阿贝云提供了免费的云服务器和免费的云虚拟主机,可根据自己的实际应用情况选择。首先注册一个账户,然后需要支付0.3元做一个实名认证,如果实名认证成功了大概率会开通成功。如果失......
  • QOJ964. Excluded Min 题解
    QOJ原题链接简要题意设\(S\)为一个可重非负整数集合,假设\(x\)为\(S\)中的一个出现次数\(\ge2\)的元素,你可以将\(x\)改成\(x+1\)或\(x-1\)。定义\(f(S)\)表示对\(S\)进行上述操作任意次所能达到的最大\(\operatorname{mex}\)。给定一个长度为\(n\)的......
  • [POJ3237] 树的维护 题解
    一眼树链剖分或\(LCT\),由于在学后者所以就写了。取反操作相当于把\(min,max\)取反后交换,所以要维护\(min,max,val\)。时间复杂度\(O(m\logn)\)。#include<bits/stdc++.h>#definefa(x)lct[x].fa#definefl(x)lct[x].fl#definemx(x)lct[x].mx#definemn(x)lct[x]......
  • python中的二叉树
    在刷算法题中,二叉树是常见的题型,掌握二叉树的基本语法和常见操作是非常重要的。以下是一些在Python中常用的二叉树语法及操作,特别是刷算法题时用到的。1.二叉树的定义:首先定义二叉树的节点结构。每个节点通常有三个属性:val(节点的值),left(左子节点),right(右子节点)。#Definitionfo......
  • 【剑指Offer刷题系列】序列化与反序列化二叉树
    目录问题描述示例示例1:示例2:示例3:示例4:提示思路解析核心思路:具体步骤:复杂度分析:代码实现Python实现测试代码复杂度分析时间复杂度空间复杂度问题描述序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内......
  • 1384. 按年度列出销售总额 - 力扣(LeetCode)
    1384.按年度列出销售总额-力扣(LeetCode)目标输入Sales表:product_idperiod_startperiod_endaverage_daily_sales12019/1/252019/2/2810022018/12/12020/1/11032019/12/12020/1/311Product表:product_idproduct_name1LCPhone2LCT-Shirt3LCKeychain输出输出product......