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

相关推荐
The_Ticker10 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Lenyiin43 分钟前
02.06、回文链表
数据结构·leetcode·链表
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
C++忠实粉丝2 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
用户37791362947552 小时前
【循环神经网络】只会Python,也能让AI写出周杰伦风格的歌词
人工智能·算法
福大大架构师每日一题2 小时前
文心一言 VS 讯飞星火 VS chatgpt (396)-- 算法导论25.2 1题
算法·文心一言