二叉树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中,依次创建左子树右子树,最后用中序进行打印。

相关推荐
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
ChoSeitaku3 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程3 小时前
双向链表专题
数据结构
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表
jrrz08283 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time3 小时前
golang学习2
算法
@小博的博客3 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生4 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步5 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝