二叉树OJ刷题与讲解

1.单值二叉树

题目链接:单值二叉树

题目描述:

这道题要求判断是否是单值二叉树也就是说每个节点的值都要相等才是单值二叉树,如果相等就返回true否则返回false,我们可以使用递归来解这道题,我们把它分为根左子树右子树,判断孩子和父亲是否相等若相等进行下次递归,直到节点为空。

代码如下:

复制代码
/**
 * 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->val != root->left->val)
        return false;
    if(root->right && root->val != root->right->val)
        return false;
    return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2.检查两颗树是否相同

题目链接:相同的树

题目描述:

我们可以分别让两颗子树遍历,然后进行判断如果不相等就返回false,若是有一颗子树先为空那也是不相等返回false,直到两颗子树都为空那就说明都相等返回true

代码如下:

复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
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. 对称二叉树

题目链接:对称二叉树

题目描述:

这道题要判断的是左子树和右子树要相等,那么我们可以通过上面那道题来帮助我们判断只要把根的左子树和根的右子树传过去就行

代码如下:

复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 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->right) && isSameTree(p->right,q->left);
 }
bool isSymmetric(struct TreeNode* root) {
    if(root == NULL)
        return true;
    
    if(root->val == root->val && isSameTree(root->left,root->right))
        return true;
    return false;
}

注意:这里要判断的是左子树和右子树是否相等,不是左子树和左子树是否相等,因为要判断是否对称


4.二叉树中序遍历

题目链接:二叉树中序遍历

题目描述:

代码如下:

复制代码
/**
 * 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 InOrder(struct TreeNode* root,int* a,int* pi)
{
    if(root == NULL)
        return;
    InOrder(root->left,a,pi);
    a[(*pi)++] = root->val;
    InOrder(root->right,a,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = TreeSize(root);
    int i = 0;
    int*a = (int*)malloc(sizeof(int)*(*returnSize));
    InOrder(root,a,&i);
    return a;
}

首先我们要知道returnSize表示的是数组元素个数,这里传过来的是一个指针类型的变量,因为函数外面可能会用到这个值,而return只能返回一个值,所以这里传地址过来是想形参改变实参,题目要求把中序遍历的结果存放在一个数组中所以我们要开辟空间,那么开辟多少空间合适呢我们可以求一下节点个数然后来申请,求节点个数也是非常简单我们用*returnSize接收,接着创建数组,进行中序遍历,这里需要定义一个函数专门用来中序遍历,因为遍历二叉树需要递归。


5.另一颗树的子树

题目链接:另一颗树的子树

题目描述:

代码如下:

复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 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(root->val == subRoot->val && isSameTree(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

判断一棵树是否与另一颗树的子树相同,也就是说root的子树是否和subroot相同,我们这里用到了上面写的代码,我们需要依次递归左子树和右子树来进行判断是否与subroot相同,只要有一颗子树相同就说明是另一颗树的子树则返回true,如果判断到为空了就说明遍历了一遍没有找到与subroot相同的子树返回false


6.二叉树的构建及遍历

题目链接:二叉树遍历

题目描述:

代码如下:

复制代码
#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
typedef struct BinaryTreeBNode
{
	BTDataType data;
	struct BinaryTreeBNode* left;
	struct BinaryTreeBNode* right;
}BTNode;
BTNode* CreateTree(char* arr,int* pi)
{
    BTNode* root = (BTNode*)malloc(sizeof(BTNode));
    if(arr[(*pi)] == '#')
    {
        (*pi)++;
        return NULL;
    }
    root->data = arr[(*pi)++];
    root->left = CreateTree(arr,pi);
    root->right = CreateTree(arr,pi);
    return root;
}
//中序
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	InOrder(root->left);
	printf("%c ", root->data);
	InOrder(root->right);

}
int main() 
{
   char a[100];
   scanf("%s",a);
   int i = 0;
   BTNode* root = CreateTree(a,&i);
   InOrder(root);
    return 0;
}

输入的字符串存放在数组中,我们需要创建二叉树,使用递归进行创建,定义一个树的节点,每次申请一个节点,如果读取到'#'就跳过,进行下一次读取,把从数组中读取到的字符存放在data中,依次创建左子树右子树,最后用中序进行打印。

相关推荐
程序员Xu14 分钟前
【OD机试题解法笔记】连续出牌数量
笔记·算法·深度优先
CoovallyAIHub27 分钟前
单目深度估计重大突破:无需标签,精度超越 SOTA!西湖大学团队提出多教师蒸馏新方案
深度学习·算法·计算机视觉
CoovallyAIHub30 分钟前
从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目
深度学习·算法·计算机视觉
偷偷的卷1 小时前
【算法笔记 day three】滑动窗口(其他类型)
数据结构·笔记·python·学习·算法·leetcode
北京地铁1号线1 小时前
Zero-Shot(零样本学习),One-Shot(单样本学习),Few-Shot(少样本学习)概述
人工智能·算法·大模型
凤年徐1 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
kualcal1 小时前
代码随想录17|二叉树的层序遍历|翻转二叉树|对称二叉树
数据结构·算法
满分观察网友z2 小时前
从混乱到有序:我用“逐层扫描”法优雅搞定公司组织架构图(515. 在每个树行中找最大值)
后端·算法
钮钴禄·爱因斯晨2 小时前
C语言 | 函数核心机制深度解构:从底层架构到工程化实践
c语言·开发语言·数据结构
满分观察网友z2 小时前
一行代码的惊人魔力:从小白到大神,我用递归思想解决了TB级数据难题(3304. 找出第 K 个字符 I)
后端·算法