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

相关推荐
IT猿手1 分钟前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost2 分钟前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
thesky1234566 分钟前
活着就好20241224
学习·算法
ALISHENGYA12 分钟前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法
guogaocai12314 分钟前
连续自成核退火热分级(SSA)技术表征共聚聚丙烯(PP)分子链结构
算法
DARLING Zero two♡37 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
游是水里的游2 小时前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_2 小时前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
南城花随雪。2 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法