数据结构——链式二叉树

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

链式二叉树的实现 

链式二叉树的结构创建

链式二叉树节点的创建

链式二叉树的创建

链式二叉树的前序遍历

链式二叉树的中序遍历

链式二叉树的后序遍历

链式二叉树的节点个数

链式二叉树叶子节点个数

链式二叉树的高度

链式二叉树的k层节点个数

链式二叉树中寻找某个值

链式二叉树的层序遍历

链式二叉树的销毁

源码:


链式二叉树的实现 

链式二叉树的结构创建

typedef int BTDataType;
typedef struct BinarytreeNode
{struct BinarytreeNode* left;struct BinarytreeNode* right;BTDataType data;
}BTNode;

链式二叉树节点的创建

BTNode* BuyNodde(BTDataType x)
{BTNode* newnode=(BTNode*)malloc(sizeof(BTNode));if(newnode==NULL){perror("malloc fail");return  NULL;}newnode->data=x;newnode->left=NULL;newnode->right=NULL;return newnode;
}

链式二叉树的创建

这里的二叉树是[1,2,4,3,null,5,6]

 

BTNode* CreatBinaryTree(void)
{BTNode* node1=BuyNodde(1);BTNode* node2=BuyNodde(2);BTNode* node3=BuyNodde(3);BTNode* node4=BuyNodde(4);BTNode* node5=BuyNodde(5);BTNode* node6=BuyNodde(6);node1->left=node2;node1->right=node4;node2->left=node3;node4->left=node5;node4->right=node6;return node1;
}

链式二叉树的前序遍历

void PrevOrder(BTNode* root)
{if(root==NULL){printf("N ");return;}printf("%d ",root->data);PrevOrder(root->left);PrevOrder(root->right);
}

链式二叉树的中序遍历

void InOrder(BTNode* root)
{if(root==NULL){printf("N ");return;}PrevOrder(root->left);printf("%d ",root->data);PrevOrder(root->right);
}

链式二叉树的后序遍历

void PostOrder(BTNode* root)
{if(root==NULL){printf("N ");return;}PostOrder(root->left);PostOrder(root->right);

链式二叉树的节点个数

int BinaryTreeSize(BTNode* root)
{if(root==NULL)return 0;return BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
}

链式二叉树叶子节点个数

int BinaryTreeleafSize(BTNode* root)
{if(root==NULL)return 0;if(root->left==NULL&&root->right==NULL)return 1;return BinaryTreeleafSize(root->left)+BinaryTreeSize(root->right);
}

链式二叉树的高度

int BinaryTreeHeight(BTNode* root)
{if(root==NULL)return 0;int ret1=BinaryTreeSize(root->left);int ret2=BinaryTreeSize(root->right);return ret1>ret2?ret1+1:ret2+1;
}

链式二叉树的k层节点个数

int KLevelBinaryTreeSize(BTNode* root,int k)
{if(root==NULL)return 0;if(k==1)return 1;return KLevelBinaryTreeSize(root->left,k-1)+KLevelBinaryTreeSize(root->right,k-1);
}

链式二叉树中寻找某个值

BTNode* BinaryTreeFind(BTNode* root,int x)
{if(root==NULL)return NULL;if(root->data==x)return root;BTNode* ret1=BinaryTreeFind(root->left, x);if(ret1)return ret1;BTNode* ret2=BinaryTreeFind(root->right, x);if(ret2)return ret2;return NULL;
}

链式二叉树的层序遍历

链式二叉树的层序遍历需要借助队列的性质,所以需要使用队列的源码

void LevelOreder(BTNode* root)
{Queue q;QueueInit(&q);if(root)QueuePush(&q, root);while(!QueueEmpty(&q)){BTNode* front=QueueFront(&q);QueuePop(&q);printf("%d ",front->data);if(front->left)QueuePush(&q, front->left);if(front->right)QueuePush(&q, front->right);}printf("\n");
}

链式二叉树的销毁

void DestroyBinaryTree(BTNode* root)
{if(root==NULL)return;DestroyBinaryTree(root->left);DestroyBinaryTree(root->right);free(root);
}

源码:

#ifndef Queue_h
#define Queue_h#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>#endif /* Queue_h */typedef struct BinarytreeNode* QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//队列的初始化
void QueueInit(Queue* pq);
//队列的销毁
void QueueDestroy(Queue* pq);
//进队列(尾插)
void QueuePush(Queue* pq,QDataType x);
//出队列(头删)
void QueuePop(Queue* pq);
//队头数据
QDataType QueueFront(Queue* pq);
//队尾数据(伏笔)
QDataType QueueBack(Queue* pq);
//返回队列的数据个数
int QueueSize(Queue* pq);
//判断队列是否为空
bool QueueEmpty(Queue* pq);void QueueInit(Queue* pq)
{assert(pq);pq->phead=NULL;pq->ptail=NULL;pq->size=0;
}
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur=pq->phead;while(cur){QNode* next=cur->next;free(cur);cur=next;}pq->phead=pq->ptail=NULL;pq->size=0;
}
void QueuePush(Queue* pq,QDataType x)
{assert(pq);QNode* newnode=(QNode*)malloc(sizeof(QNode));if(newnode==NULL){perror("malloc fail\n");return;}newnode->data=x;newnode->next=NULL;if(pq->phead==NULL)//当链表为空的时候{assert(!pq->ptail);//当链表为空的时候,pq->ptail也是空pq->phead=newnode;pq->ptail=newnode;}//链表不为空的时候进队列插入数据(尾插)else{pq->ptail->next=newnode;pq->ptail=newnode;}pq->size++;
}
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//判断队列是否为空,断言为真程序继续//一个节点的时候//if(pq->phead->next==NULL)if(pq->phead==pq->ptail){free(pq->phead);pq->phead=NULL;pq->ptail=NULL;}//多个节点的时候else{//相当于头删QNode* next=pq->phead->next;free(pq->phead);pq->phead=next;}pq->size--;
}
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//判断队列是否为空,断言为真程序继续return pq->phead->data;
}
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead==NULL;
}
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}typedef int BTDataType;
typedef struct BinarytreeNode
{struct BinarytreeNode* left;struct BinarytreeNode* right;BTDataType data;
}BTNode;
BTNode* BuyNodde(BTDataType x)
{BTNode* newnode=(BTNode*)malloc(sizeof(BTNode));if(newnode==NULL){perror("malloc fail");return  NULL;}newnode->data=x;newnode->left=NULL;newnode->right=NULL;return newnode;
}
BTNode* CreatBinaryTree(void)
{BTNode* node1=BuyNodde(1);BTNode* node2=BuyNodde(2);BTNode* node3=BuyNodde(3);BTNode* node4=BuyNodde(4);BTNode* node5=BuyNodde(5);BTNode* node6=BuyNodde(6);node1->left=node2;node1->right=node4;node2->left=node3;node4->left=node5;node4->right=node6;return node1;
}
//前序遍历
void PrevOrder(BTNode* root)
{if(root==NULL){printf("N ");return;}printf("%d ",root->data);PrevOrder(root->left);PrevOrder(root->right);
}
//中序遍历
void InOrder(BTNode* root)
{if(root==NULL){printf("N ");return;}PrevOrder(root->left);printf("%d ",root->data);PrevOrder(root->right);
}
//后序遍历
void PostOrder(BTNode* root)
{if(root==NULL){printf("N ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ",root->data);
}//求二叉树的个数
int BinaryTreeSize(BTNode* root)
{if(root==NULL)return 0;return BinaryTreeSize(root->left)+BinaryTreeSize(root->right)+1;
}//求二叉树的叶子节点int BinaryTreeleafSize(BTNode* root)
{if(root==NULL)return 0;if(root->left==NULL&&root->right==NULL)return 1;return BinaryTreeleafSize(root->left)+BinaryTreeSize(root->right);
}//求二叉树的高度int BinaryTreeHeight(BTNode* root)
{if(root==NULL)return 0;int ret1=BinaryTreeSize(root->left);int ret2=BinaryTreeSize(root->right);return ret1>ret2?ret1+1:ret2+1;
}//求树的k层节点
int KLevelBinaryTreeSize(BTNode* root,int k)
{if(root==NULL)return 0;if(k==1)return 1;return KLevelBinaryTreeSize(root->left,k-1)+KLevelBinaryTreeSize(root->right,k-1);
}//树中节点的寻找,找到返回这个节点
BTNode* BinaryTreeFind(BTNode* root,int x)
{if(root==NULL)return NULL;if(root->data==x)return root;BTNode* ret1=BinaryTreeFind(root->left, x);if(ret1)return ret1;BTNode* ret2=BinaryTreeFind(root->right, x);if(ret2)return ret2;return NULL;
}
//层序遍历
void LevelOreder(BTNode* root)
{Queue q;QueueInit(&q);if(root)QueuePush(&q, root);while(!QueueEmpty(&q)){BTNode* front=QueueFront(&q);QueuePop(&q);printf("%d ",front->data);if(front->left)QueuePush(&q, front->left);if(front->right)QueuePush(&q, front->right);}printf("\n");
}//二叉树的销毁
void DestroyBinaryTree(BTNode* root)
{if(root==NULL)return;DestroyBinaryTree(root->left);DestroyBinaryTree(root->right);free(root);
}
int main()
{//创建链式二叉树BTNode* root=NULL;root=CreatBinaryTree();printf("前序遍历:");PrevOrder(root);printf("\n");printf("中序遍历:");InOrder(root);printf("\n");printf("后序遍历:");PostOrder(root);printf("\n");printf("树的节点个数:%d\n",BinaryTreeSize(root));printf("树的叶子节点的个数:%d\n",BinaryTreeleafSize(root));printf("树的高度为:%d\n",BinaryTreeHeight(root));printf("树的第三层的节点个数:%d\n",KLevelBinaryTreeSize(root, 3));printf("树中的数值5:%d\n",BinaryTreeFind(root, 5)->data);printf("层序遍历:\n");LevelOreder(root);return 0;
}

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251241.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开源oppo,华为鸿蒙开源,OPPO公关粗鄙言论将自己置于舆论风暴中

最近&#xff0c;社交媒体上的两张截图火了&#xff0c;截图之一称其它安卓厂商“明显不会”用鸿蒙&#xff0c;截图之二称“OPPO员工表示不上鸿蒙&#xff0c;并爆粗口”。 我们不确定这些看法基于怎样的讨论场景&#xff0c;又出自何人之口&#xff0c;但还是暴露两个现象&am…

OPPO开放平台上架APP

OPPO开放平台https://open.oppomobile.com/&#xff08;需要软著&#xff09; 管理中心 选择分发服务中软件&游戏 创建应用 填写APP资料 上传LOGO/应用截图/软著等&#xff0c;提交审核 审核过程非常快&#xff0c;不像小米/华为/魅族/ 比较慢&#xff1b;并且OPPO审核没…

oppo 升级 android 8.1,OPPO首发安卓8.1更新了什么

近日&#xff0c;OPPO基于Android 8.1开发的ColorOS开始公测&#xff0c;还忙着升级Android 8.0的时候&#xff0c;OPPO居然直接就搞定Android 8.1了&#xff0c;那么很多人好奇&#xff0c;OPPO首发安卓8.1更新了什么?本文为大家带来了OPPO升级安卓8.1更新内容介绍... OPPO R…

oppor15android版本8.1,OPPO R15体验:基于安卓8.1,ColorOS 5.0更好用

当目前智能手机硬件性能普遍过剩&#xff0c;越来越多的人们开始逐渐意识到&#xff0c;参数并不等于体验&#xff0c;反而是依附于硬件之上的操作系统很大程度上直接决定了一款智能手机的使用体验。 在当前智能手机市场&#xff0c;虽然说安卓系统占据了绝大部分市场份额&…

OPPO A37M刷机

OPPO A37m刷机步骤&#xff1a; 1、首先在电脑上&#xff0c;下载好OPPO A37m手机的官方线刷包&#xff1a;https://pan.baidu.com/s/1f-QFMIxuhASxjDuuF9RTqw 2、右击下载的刷机包&#xff0c;通过rar等压缩解压出来后&#xff0c;可以看到刷机包和教程文件。 3、先安装好&…

oppor15android版本8.1,OPPO R15搭载最新ColorOS 5.0系统,基于安卓8.1更好用

原标题&#xff1a;OPPO R15搭载最新ColorOS 5.0系统&#xff0c;基于安卓8.1更好用 手机的发展十分之快&#xff0c;硬件性能普遍过剩&#xff0c;而手机系统的更新迭代变得异常重要&#xff0c;而越来越多的消费者也意识到这个问题&#xff0c;想获得更好的使用体验&#xff…

oppo手机android功能,OPPO 手机抢先升级安卓8.1系统,新增AI快捷功能

原标题&#xff1a;OPPO 手机抢先升级安卓8.1系统&#xff0c;新增AI快捷功能 对于一部手机是否好&#xff0c;或许很多人都看工艺&#xff0c;拍照以及配置&#xff0c;其实手机系统也是非常关键的&#xff0c;目前使用最多的依旧还是安卓系统&#xff0c;不过现在已经升级到了…

oppo导出照片计算机找不到了,OPPO手机保存的图片找不到怎么办?

用OPPO手机在贴吧、空间或者其他软件看到漂亮的图片。保存下来&#xff0c;一看相册却不见了&#xff01;&#xff01;&#xff01;其实只是被隐藏了&#xff0c;只要一步就能让他们出现。 方法一&#xff1a;取消隐藏 其实下载的图片都在相册里&#xff0c;只不过被隐藏了~ 只…

OPPO新版云测平台使用教程

远程真机入口 进入管理中心 按照下图导航点击“管理中心“&#xff0c;进入管理中心页面 进入云测服务页面 在管理中心点击“云测服务“&#xff0c;进入云测服务页面。 进入真机页面 在云测服务点击“远程真机-真机“进入远程真机页面 选择设备 找到设备 在设备列表中可…

android8OPPO,基于安卓8.1!OPPO R15深度体验:ColorOS 5.0焕然一新

当目前智能手机硬件性能普遍过剩&#xff0c;越来越多的人们开始逐渐意识到&#xff0c;参数并不等于体验&#xff0c;反而是依附于硬件之上的操作系统很大程度上直接决定了一款智能手机的使用体验。 在当前智能手机市场&#xff0c;虽然说安卓系统占据了绝大部分市场份额&…

oppoa83t怎么升级android8,OPPO A83t原版系统刷机包_OPPO A83t最新升级包更新下载

下面也是咱们的OPPO A83t手机专用的原版的系统刷机包了&#xff0c;之前也是有机友说自己的手机系统出问题最&#xff0c;想刷回官方原版的rom包&#xff0c;不过现在网上很多提供的是第三方的rom刷机包&#xff0c;并非是官方的rom包&#xff0c;所以下面特意整理了一个详细的…

oppo升级android,OPPO Real R807升级Android4.0教程

2012-4-20 17:47 【天极网手机频道】前几天&#xff0c;小编爆料了OPPO Real R807升级Android4.0曝光图,现在R807首个ICS体验版(网友版本)&#xff0c;终于来了!!!下面就是小编汇总结的教程&#xff0c;让我们一起看看吧。 图&#xff1a;OPPO Real R807 OPPO R807 ICS …

OPPOa5m手机Android,OPPO A5怎么样?OPPO A5手机体验评测

OPPO A5怎么样&#xff1f;据相关媒体报道&#xff0c;OPPO官方本月初低调的发布了旗下A系列的最新机型——“OPPO A5”。那么问题出现了&#xff0c;OPPO A5究竟怎么样&#xff1f;OPPO A5值不值得买呢&#xff1f;想知道答案的朋友&#xff0c;不妨来看看小编分享的OPPO A5手…

ios与android指纹识别,iOS开发实现TouchID指纹解锁

一直想实现一下指纹解锁&#xff0c;苦于一直没时间&#xff0c;最近终于闲了下来所以翻了翻文档看了看demo&#xff0c;完成了这篇教程。本功能实现起来是很简单的&#xff0c;因为苹果都已经帮我们封装好了&#xff0c;只需要实现几个方法就可以了。 实现效果图 实现过程 1.首…

指纹识别综述(2): 指纹传感器

本文主要基于《Handbook of Fingerprint Recognition》第三版第二章“Fingerprint Sensing”的内容。本文会不定期更新&#xff0c;以反映一些新的进展和思考。 1、引言 指纹识别系统利用传感器、图像处理、模式识别技术自动识别两个指纹是否一致。指纹识别系统主要有三个模块…

苹果手机指纹识别坏了怎么办?维修需要多少钱?

手机指纹识别是从哪一年开始的已经记不清了&#xff0c;但是其便利性却是越来越受大家喜爱。可是问题来了&#xff0c;对于现在有iPhone手机的用户来说&#xff0c;肯定遇到过指纹识别失效的问题。遇到这样指纹无法识别的情况该怎么办呢&#xff1f;我们从一些苹果售后维修点处…

支付宝 android 指纹支付,指纹支付教程放出!支付宝支持指纹支付!

近日&#xff0c;继网易邮箱、腾讯QQ之后&#xff0c;第三款支持Touch ID指纹的iOS端App诞生了&#xff0c;这款应用正是如今大红大紫的支付宝钱包App。在更新至最新版的支付宝钱包里&#xff0c;用户可以通过设置调用Touch ID指纹&#xff0c;这样iPhone用户移动支付便可以优雅…

设置自动关门时长_小米苹果全适配,绿米D100全自动指纹锁新鲜上手

Ciao Bella&#xff0c;我是老房 关于智能指纹门锁&#xff0c;其实老房老早就想装了。家里有位平均一两个月就要忘带一次钥匙的媳妇儿&#xff0c;甚至有好几次&#xff0c;我特意说了晚上有应酬晚回去千万记得要带钥匙&#xff0c;结果喝酒喝到一半&#xff0c;一个电话打过来…

DFS专题

题单地址&#xff1a;【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 老子的全排列呢 dfs回溯 int n 8; int idx; int record[10]; bool vis[10];void dfs(int num) {if(numn){for(int i1;i<n;i) cout<<record[i]<…

HBase集群搭建

hbase 1.解压HBase安装包 先 下载HBase压缩包&#xff0c;并解压安装文件&#xff0c;示例代码如下&#xff1a; tar -zxvf hbase-2.0.1-bin.tar.gz2. 修改配置文件 编辑 conf目录下的 hbase-env.sh文件&#xff0c;示例代码如下&#xff1a; cd conf vi hbase-env.sh添加…