二叉树基础oj练习

news/2024/11/28 20:48:05/

1.单值二叉树

题目:

力扣https://leetcode.cn/problems/univalued-binary-tree/

思路:

单值二叉树 = root和左右孩子的值相等 + 左子树是单值二叉树 + 右子树是单值二叉树

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/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);
}

2.相同的树

题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/same-tree/submissions/

思路:

相同二叉树 = 比较两棵树的根 + 递归左子树(是否是相同二叉树)+ 递归右子树(是否是相同二叉树)

代码:

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

3.对称二叉树

 题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/symmetric-tree/

思路:

解题方法和上一道题相似

原来的函数接口上是递归不起来的,因此要写一个子函数。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/bool _isSymmetricTree(struct TreeNode* root1,struct TreeNode*root2){if(root1==NULL&&root2==NULL)return true;if(root1==NULL||root2==NULL)return false;if(root1->val!=root2->val)return false;return _isSymmetricTree(root1->left,root2->right)&&_isSymmetricTree(root1->right,root2->left);}bool isSymmetric(struct TreeNode* root)
{if(root==NULL)return true;return _isSymmetricTree(root->left,root->right);
}

4.二叉树的前序遍历

题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/binary-tree-preorder-traversal/

思路:

  • 计算二叉树的节点个数
  • 创建新的数组,数组大小为二叉树总结点大小
  • 前序遍历根,左,右

 代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*///计算二叉树的节点个数int TreeSize(struct TreeNode*root){return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;}//创建新的数组,数组大小为二叉树总结点大小
void _preorderTraversal(struct TreeNode*root,int*a,int*pi)
{if(root==NULL)return;//进行前序遍历根,左,右printf("%d ",root->val);a[(*pi)++]=root->val;_preorderTraversal(root->left,a,pi);_preorderTraversal(root->right,a,pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize)
{int size=TreeSize(root);printf("size:%d\n",size);int*a=malloc(sizeof(int)*size);int i=0;_preorderTraversal(root,a,&i);*returnSize=size;return a;
}

5. 二叉树中序遍历 

题目:

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/binary-tree-inorder-traversal/

思路:

  • 计算二叉树的节点个数
  • 创建新的数组,数组大小为二叉树总结点大小
  • 中序遍历左,根,右

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*///计算二叉树的节点个数int TreeSize(struct TreeNode*root){return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;}//创建新的数组,数组大小为二叉树总结点大小
void _inorderTraversal(struct TreeNode*root,int*a,int*pi)
{if(root==NULL)return;//进行中序遍历左,根,右printf("%d ",root->val);_inorderTraversal(root->left,a,pi);a[(*pi)++]=root->val;_inorderTraversal(root->right,a,pi);
}int* inorderTraversal(struct TreeNode* root, int* returnSize)
{int size=TreeSize(root);printf("size:%d\n",size);int*a=malloc(sizeof(int)*size);int i=0;_inorderTraversal(root,a,&i);*returnSize=size;return a;
}

 6.二叉树后序遍历 

题目:

力扣icon-default.png?t=MBR7https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

思路:

  • 计算二叉树的节点个数
  • 创建新的数组,数组大小为二叉树总结点大小
  • 后序遍历左,右,根,

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*///计算二叉树的节点个数int TreeSize(struct TreeNode*root){return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;}//创建新的数组,数组大小为二叉树总结点大小
void _postorderTraversal(struct TreeNode*root,int*a,int*pi)
{if(root==NULL)return;//进行中序遍历左,根,右printf("%d ",root->val);_postorderTraversal(root->left,a,pi);_postorderTraversal(root->right,a,pi);a[(*pi)++]=root->val;
}int* postorderTraversal(struct TreeNode* root, int* returnSize)
{int size=TreeSize(root);printf("size:%d\n",size);int*a=malloc(sizeof(int)*size);int i=0;_postorderTraversal(root,a,&i);*returnSize=size;return a;
}

7.另一颗树的子树

题目:

力扣icon-default.png?t=MBR7https://leetcode-cn.com/problems/subtree-of-another-tree/

思路:

 思路: 相同的树+递归左子树+递归右子树

代码: 

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{//根,都为空if(p==NULL&&q==NULL)return true;//其中一个根为空if(p==NULL||q==NULL)return false;//都不为空if(p->val!=q->val)return false;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);
}


http://www.ppmy.cn/news/19316.html

相关文章

01网络协议:从TCP协议到RPC协议都经历了哪些?

无论是TCP/IP四层协议还是OSI七层网络协议,传输层的TCP都是非常重要的一个网络协议,众所周知TCP是建立在IP协议之上的点对点可靠的传输协议,不同于IP和UDP,TCP有三次握手、四次挥手等机制可以确保客户端和服务端建立安全的连接和释放连接,并提供拥塞控制、滑动窗口等数据传…

离线召回与排序介绍

3.3 离线召回与排序介绍 学习目标 目标 了解召回排序作用知道头条推荐召回排序设计应用 无 3.3.1 召回与排序介绍 召回:从海量文章数据中得到若干候选文章召回集合(数量较多) 排序:从召回集合中读取推荐文章,构建样本特征进行排序过滤筛选…

【JavaSE专栏4】关键字、标识符和命名规范

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导。CSDN学院、蓝桥云…

JVM快速入门学习笔记(三)

9. 栈 栈:8大基本类型对象引用 栈运行原理:栈帧 程序正在执行的方法,一定在栈的顶部 9.1 JVM数据区 先上一张Java虚拟机运行时数据区中堆、栈以及方法区存储数据的概要图,如下所示: 9.2 堆 堆是存储时的单位&…

Linux下动静态库的打包与使用C C++

目录前言为什么用动静态库动态链接与静态链接底层优缺点Linux下的动静态库动静态库的对比打包静态库使用静态库打包动态库使用动态库小结win下打包动静态库前言 为什么用动静态库 我们在实际开发中,经常要使用别人已经实现好的功能,这是为了开发效率和…

OSG三维渲染引擎编程学习之二十八:“第三章:OSG场景组织” 之 “3.10 Switch开关节点”

目录 第三章:OSG场景组织 3.10 Switch开关节点 3.10.1 Switch介绍 3.10.2 Switch示例 第三章:OSG场景组织 在OSG中存在两个树:场景树、渲染树。其中,场景树是由一系列节点Node组成,这些节点Node可以是矩阵变换、状态变换,也可以是绘制对象等。场景树反映了场景的空间…

5、基本数据类型

目录 一、整数类型 二、浮点类型 三、字符类型 四、布尔类型 一、整数类型 整数类型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整 型数据在Java程序中有3种表示形式,分别为十进制、八进制和十六进制。 1.十进…

学习率衰减、局部最优、Batch归一化、Softmax回归

目录1.学习率衰减(Learning rate decay)在训练初期,梯度下降的步伐大一点,开始收敛的时候,小一些的学习率能让步伐小一些。1 epoch 遍历一遍训练集学习率衰减公式:例:假设衰减率decayrate 1,0.2epochNumα…