数据结构——二叉树(OJ练习)

这篇具有很好参考价值的文章主要介绍了数据结构——二叉树(OJ练习)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,本期是二叉树的最后一期,这一期我们来看看二叉树的编程题

单值二叉树

. - 力扣(LeetCode)

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

首先我们的思路是:遍历二叉树,把每个节点去比较一次,按照要求返回

我们来看代码

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);
    
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

检查两颗树是否相同

. - 力扣(LeetCode)

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

这里我们的思路是:同时遍历两给树,遇到空树或者不相等时返回。

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);
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

对称二叉树

. - 力扣(LeetCode)

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

我们仔细观察该对称二叉树,我们发现互相对称的节点它们的左子树与右子树分别相等,这就是突破口,我们可以重新创建一个函数,将参数分成两个一左一右两个节点,然后向下比较,这个过程与上一题类似。

我们来看代码

bool _isSymmetric(struct TreeNode* pl,struct TreeNode* pr){
    if(pl==NULL&&pr==NULL){
        return true;
    }
    if(pl==NULL||pr==NULL){
        return false;
    }
    if(pl->val!=pr->val){
        return false;
    }
    return _isSymmetric(pl->left,pr->right)&&_isSymmetric(pl->right,pr->left);
}
bool isSymmetric(struct TreeNode* root) {
    return _isSymmetric(root->left,root->right);
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

另一颗树的子树

. - 力扣(LeetCode)

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

这题我们的思路是找出root所有的子树跟subroot比较,这里的比较函数我们前面已经写过了,如果相同就返回true,如果没找到就返回false

代码如下

//比较函数
bool pdxt(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 pdxt(p->left,q->left)&&pdxt(p->right,q->right);

}


bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL){
        return false;
    }
    if(pdxt(root,subRoot)){
       return true;
    }

    return isSubtree( root->left, subRoot)||isSubtree( root->right, subRoot);
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

二叉树的前序遍历

. - 力扣(LeetCode)

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

这一题可跟我们前一期的前序遍历有所不同,我们仔细观察一下他给我们的参数是一个二叉树的根和一个int*的指针,这个指针是输出型指针,也就是说这个指针是出题人用来获取二叉树节点个数的,而这个函数的返回类型是int*,它要我们返回一个存储二叉树数据的数组,所以我们这里最好动态开辟内存来存储,

所以我们的思路是用两个子函数来辅助完成,一个函数来计算二叉树的节点数一个函数用来遍历二叉树,最后由原函数返回。

int evertreenode(struct TreeNode* root){
    return root==NULL?0: evertreenode(root->left)+evertreenode(root->right)+1;
}

void qianxu(struct TreeNode*root,int*a,int*i){
    if(root==NULL){
        return;
    }
    a[(*i)++]=root->val;
     qianxu(root->left,a,i);
     qianxu(root->right,a,i);
}




int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=evertreenode(root);
    int*a=(int*)malloc(sizeof(int)*(*returnSize));
    int i=0;
    qianxu(root,a,&i);
    return a;
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

二叉树的构建与销毁

二叉树的销毁

我们的思路是遍历二叉树,把节点一个一个销毁,那么这里我们选什么方式遍历?

答案是后序,因为前序是先销毁根,如果根销毁了就找不到,只能先把左右子树先存储起来再销毁。(这里三种遍历顺序都可以,只是后序更好)。

void treeDestory(BTnode* node1) {
	if (node1 == NULL) {
		return;
	}
	treeDestory(node1->lest);
	treeDestory(node1->right);
	free(node1);
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

判断二叉树是否是完全二叉树

这一题我们就要用到我们上一期学习的层序遍历来实现了,主要思路是,用层序遍历如果遇到NULL后还可以遇到不为空的节点就不是完全二叉树。

说到层序遍历我们就会想到队列,下面是队列的源码大家可以直接使用

Queue.h

# include<stdio.h>
# include<assert.h>
# include<stdlib.h>
# include<string.h>
# include<errno.h>
# include<stdbool.h>


typedef struct Qhead Qhead;
typedef struct Queue Queue;
typedef struct Binarytreenode BTnode;

//二叉树
struct Binarytreenode {
	int size;//保存的数据
	BTnode* lest;//左子树
	BTnode* right;//右子树
};


//链表结构
struct Qhead {
	BTnode* size;
	struct Qhead* next;
};

//队列结构
struct Queue {
	Qhead* top;//队头
	Qhead* end;//队尾
	int SZ;
};


//初始化
void Queueinit(Queue* head);
//队尾输入数据
void Queuepush(Queue* head, BTnode* n);
//判断队列是否为空
bool QueueEmpty(Queue* haed);

//队头删除数据
void Queuepop(Queue* head);

//获取对头数据
BTnode* Queuefrost(Queue* head);

//获取队列中的有效元素个数
int Queuesize(Queue* head);

//销毁队列
void QueueDestroy(Queue* head);

Queue.c

//初始化
void Queueinit(Queue* head) {
	assert(head);
	head->end = NULL;
	head->top = NULL;
	head->SZ = 0;
}


//队尾输入数据
void Queuepush(Queue* head, BTnode* n) {
	assert(head);
		Qhead* ps = (Qhead*)malloc(sizeof(Qhead));
		if (ps == NULL) {
			printf("%s", strerror(errno));
			return;
		}
		ps->next = NULL;
		ps->size = n;
		if (head->top) {
			head->end->next = ps;
			head->end = head->end->next;
		}
		else {
			head->top = ps;
			head->end = ps;
		}
		head->SZ++;
}
//判断队列是否为空
bool QueueEmpty(Queue* head) {
	assert(head);
	return head->SZ == 0;
}



//队头删除数据
void Queuepop(Queue* head) {
	assert(head);
	assert(!QueueEmpty(head));
	if (head->top->next == NULL) {
		free(head->top);
		head->top = NULL;
		head->end = NULL;
	}
	else {
		Qhead* cur = head->top->next;
		head->top->next = NULL;
		free(head->top);
		head->top = cur;
	}
	head->SZ--;
}

//获取队头数据
BTnode* Queuefrost(Queue* head) {
	assert(head);
	assert(!QueueEmpty(head));
	return head->top->size;
}

//获取队列中的有效元素个数
int Queuesize(Queue* head) {
	assert(head);
	return head->SZ;
}
//销毁队列
void QueueDestroy(Queue* head) {
	assert(head);
	while (head->top == NULL) {
		Qhead* cur = head->top->next;
		head->top->next = NULL;
		free(head->top);
		head->top = cur;
	}
	head->top = NULL;
	head->end = NULL;
	head->SZ = 0;
}

下面是判断完全二叉树的代码

//判断树是不是完全二叉树
bool BTcomplete(BTnode* root) {
	Queue head;
	Queueinit(&head);
	if(root)
	Queuepush(&head,root);
	while (!QueueEmpty(&head)) {
		BTnode* frost = Queuefrost(&head);
		Queuepop(&head);
		if (frost == NULL)
			break;
		Queuepush(&head, frost->lest);
		Queuepush(&head, frost->right);
	}
	while (!QueueEmpty(&head)) {
		BTnode* frost = Queuefrost(&head);
		Queuepop(&head);
		if (frost != NULL) {
			QueueDestroy(&head);
			return false;
		}
	}
	QueueDestroy(&head);
	return true;

}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

我们可以测试一下。

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

二叉树的创建

二叉树遍历_牛客题霸_牛客网

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

这道题我们要从一个先序数组中读取数据构建二叉树。

我们的思路是先创建一个二叉树的结构体,然后将他初始化,再从数组中按照前序来读取数据并为它们开辟一个节点来存储,然后把这些节点按前序来插入。遇到‘#’就说明这是空树。

#include <stdio.h>
# include<stdlib.h>

//二叉树的结构
typedef struct treenode BTnode;
struct treenode{
    char size;
    BTnode*left;
    BTnode*right;
};
//初始化
 BTnode* treeinit(char add){
    BTnode*root=(BTnode*)malloc(sizeof(BTnode));
    if(root==NULL){
        return NULL;
    }
    root->left=NULL;
    root->right=NULL;
    root->size=add;
    return root;
 }

 //在二叉树中插入数据
BTnode* treepush(char*ps,int*i){
    if(ps[*i]=='#'){
        (*i)++;
        return NULL;
    }
    BTnode*root=treeinit(ps[*i]);
    (*i)++;
    root->left=treepush(ps,i);
    root->right=treepush(ps,i);
    return root;
 }
 //中序输出
 void intree(BTnode*root){
    if(root==NULL){
        return;
    }
    intree(root->left);
    printf("%c ",root->size);
    intree(root->right);
 }


int main() {
    int i=0;
    char add[100];
    scanf("%s",add);
     BTnode* root =treepush(add,&i);
    intree(root);
    return 0;
}

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程

我们可以从这道题找出二叉树创建的函数

BTnode* treepush(char*ps,int*i){
    if(ps[*i]=='#'){
        (*i)++;
        return NULL;
    }
    BTnode*root=treeinit(ps[*i]);
    (*i)++;
    root->left=treepush(ps,i);
    root->right=treepush(ps,i);
    return root;
 }

经过了这几期的学习我们二叉树学习就告一段落了,这并不意味着我们二叉树已经学完了,随着我们的学习我们还会再学习二叉树的。

  以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。 

数据结构——二叉树(OJ练习),数据结构,数据结构,算法,链表,c语言,青少年编程文章来源地址https://www.toymoban.com/news/detail-848800.html

到了这里,关于数据结构——二叉树(OJ练习)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode】【数据结构】二叉树必刷OJ题

    👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 【LeetCode】226.翻转二叉树 【LeetCode】100.相同的树 【LeetCode】5.对称二叉树 【LeetCode】9.另一颗树的子树

    2024年02月08日
    浏览(51)
  • 【数据结构】二叉树OJ题(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年03月17日
    浏览(45)
  • 【数据结构】二叉树的相关操作以及OJ题目

    当一个树不是满二叉树或完全二叉树时,它是不适合使用数组存储的,它应该使用链式结构来存储。 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点的左子树、根节点的右子树组成的。 从概念中可以看出,二叉树定义是递归式的,因

    2024年03月19日
    浏览(50)
  • 数据结构:链表基础OJ练习+带头双向循环链表的实现

    目录 一.leetcode剑指 Offer II 027. 回文链表 1.问题描述 2.问题分析与求解 (1) 快慢指针法定位链表的中间节点 (2) 将链表后半部分进行反转 附:递归法反转链表 (3) 双指针法判断链表是否回文 二.带头双向循环链表的实现 1.头文件 2.节点内存申请接口和链表初始化接口 3.链表的打

    2024年02月02日
    浏览(51)
  • 数据结构——二叉树练习题

    目录 单值二叉树  相同的树  另一棵树的子树 二叉树的前序遍历  二叉树的构造及遍历 给大家推荐一款刷题,找工作的好网站——牛客网 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网   思路:根节点跟左子树比较,若相等则继续比,一

    2024年02月11日
    浏览(41)
  • 数据结构:二叉树:第3关:基于二叉链表的二叉树的遍历

    任务描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写三个递归算法分别实现二叉树的先序、中序和后序遍历。 编程要求 输入 多组数据。每组数据一行,为二叉树的前序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个

    2024年02月03日
    浏览(42)
  • 【数据结构】---二叉树类型部分练习解析让你更深程度了解二叉树

    👧个人主页:@小沈熬夜秃头中୧⍤⃝❅ 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:数据结构 🔑本章内容:二叉树类型部分练习 送给各位💌:月亮本无光 努力久了便会万丈光芒 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇文章正文内容,下

    2024年02月07日
    浏览(34)
  • 数据结构初阶之二叉树性质练习与代码练习

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题       数据结构初阶    Linux 欢迎大家点赞,评论,收藏。 一起努力,共赴大厂。 目录 1.前言 2.性质练习 3.代码练习  3.1单值二叉树 3.2检查两颗树

    2024年02月04日
    浏览(47)
  • Java常见的数据结构:栈、队列、数组、链表、二叉树、二叉查找树、平衡二叉树、红黑树

    数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 栈 队列 数组 链表 二叉树 二叉查找树 平衡二叉树 红黑树... 后进先出,先进后出 数据进入栈模型的过程称为

    2024年02月07日
    浏览(46)
  • 数据结构:完全二叉树开胃菜小练习

    目录 一.前言 二.完全二叉树的重要结构特点 三.完全二叉树开胃菜小练习 1.一个重要的数学结论 2.简单的小练习 关于树及完全二叉树的基础概念(及树结点编号规则)参见 : http://t.csdn.cn/imdra http://t.csdn.cn/imdra 完全二叉树是一种非常重要的数据结构: n个结点的完全二叉树 的 结点

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包