当前位置: 首页 > news >正文

广东微信网站制作价格怎么创建网页

广东微信网站制作价格,怎么创建网页,欧美网站设计,现在疫情又来了吗最新消息Hello大家好,我是但凡!很高兴我们又见面啦! 眨眼间已经到了2024年的最后一天,在这里我要首先感谢过去一年陪我奋斗的每一位伙伴,是你们给予我不断前行的动力。银蛇携福至,万象启新程。蛇年新春之际&#xf…

         Hello大家好,我是但凡!很高兴我们又见面啦!

        眨眼间已经到了2024年的最后一天,在这里我要首先感谢过去一年陪我奋斗的每一位伙伴,是你们给予我不断前行的动力。银蛇携福至,万象启新程。蛇年新春之际,愿你们万事顺遂,岁月皆安,新的一年所想皆如愿,所行皆坦途 。

        好了,给生活添点passion,开始今天的编程之路!

我的博客:<但凡.

我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》

欢迎点赞,关注!

目录

1、 二叉树的动态模拟

1.1新建节点 

1.2建树

1.3计算树的节点个数

1.3.1方法一

1.3.2方法二   

1.4计算树的叶子节点个数

1.5 计算树的第K层节点个数

1.6 树的深度

1.7查找节点 

1.8 遍历

1.8.1前序遍历

1.8.2中序遍历

1.8.3后序遍历

1.8.4层序遍历(广度优先遍历)

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

1.10销毁二叉树

   2、二叉树的静态模拟实现


 

1、 二叉树的动态模拟

        我们用链式结构实现二叉树。一般链式结构实现二叉树,我们的结构中包含三个元素,一是该节点的数据,二是左子树节点,三是右子树节点

typedef char BTtype;
typedef struct BinaryTreeNode
{BTtype x;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTnode;

1.1新建节点 

BTnode* BTbuybode(char a)//你这声明和定义都不是一个意思好的
{BTnode* p = (BTnode*)malloc(sizeof(BTnode));if (p == NULL){perror("malloc error!");exit(1);}p->left = NULL;p->right = NULL;p->x = a;return p;
}

1.2建树

         需要注意的是,我们的树是需要手动去建的,所以我在这只是给大家一个示例:

//建树
BTnode* nodeA=BTbuybode('A');
BTnode* nodeB = BTbuybode('B');
BTnode* nodeC = BTbuybode('C');
BTnode* nodeD = BTbuybode('D');
BTnode* nodeE = BTbuybode('E');
nodeA->left = nodeB;
nodeA->right = nodeC;
nodeB->left = nodeD;
nodeC->left = nodeE;
BTnode* root = nodeA;

建的树是这样的:

         那么接下来我们就实现以下和树相关的操作。准备好迎接递归的极致暴力美学!

1.3计算树的节点个数

1.3.1方法一

        方法一就是咱们把size作为一个函数的形参,然后把这个树遍历一遍,每遍历一个节点就size(节点个数)加一。但需要注意的是,我们需要传入size的地址才能改变size的值。

void BinaryTreeSize(BTnode* root,int* size)
{if (root == NULL){return;}(*size)++;BinaryTreeSize(root->left,size);BinaryTreeSize(root->right, size);
}

1.3.2方法二   

        方法二是纯递归:  节点个数=左子树节点个数+右子树节点个数,所以我们以此为基础递归就可以了。

int BinaryTreeSize(BTnode* root)
{//节点个数=左子树节点个数+右子树节点个数//递归出口if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

1.4计算树的叶子节点个数

        树的叶子结点就是没有左右子树的节点,所以咱们得设置两个递归出口。

int BinaryTreeLeafSize(BTnode* root)
{//递归出口if (root == NULL){return 0;}if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

1.5 计算树的第K层节点个数

        当咱们K减成1的时候,就说明到达了第K层。

int BinaryTreeLevelKSize(BTnode* root, int k)
{//递归出口if(k==1){if (root == NULL){return 0;}else{return 1;}}return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}

1.6 树的深度

        注意我是拿C++写的,用了自带的函数max,如果使用C语言写的话max函数得自己写,或者用一个问号表达式来实现类似效果。

int BinaryTreeDeep(BTnode* root)
{//计算树的深度if (root == NULL){return 0;}return 1 + max(BinaryTreeDeep(root->left), BinaryTreeDeep(root->right));
}

1.7查找节点 

BTnode* BinaryTreeFind(BTnode* root, BTtype x)
{//递归出口if (root == NULL){return 0;}if (root->x == x){return root;}BTnode* left = BinaryTreeFind(root->left, x);if(left){return root;}BTnode* right = BinaryTreeFind(root->right, x);if (right){return root;}return NULL;
}

1.8 遍历

1.8.1前序遍历

        前序遍历就是先遍历头节点,然后遍历左子树,最后遍历右子树。我们可以把它拆开来想,我们左子树依然用先遍历头,再遍历左子树,最后遍历右子树的方式来遍历,左子树的左子树依然如此......

void BinaryTreePrevOrder(BTnode* root)
{//头 左 右//递归出口if (root == NULL){cout << "NULL" << " ";return;}cout << root->x << " ";BinaryTreePrevOrder(root->left);BinaryTreePrevOrder(root->right);
}

1.8.2中序遍历

void BinaryTreeInOrder(BTnode* root)
{//左 头 右//递归出口if (root == NULL){cout << "NULL" << " ";return;}BinaryTreeInOrder(root->left); //注意别调用错了,调用中序的cout << root->x << " ";BinaryTreeInOrder(root->right);
}

1.8.3后序遍历

void BinaryTreePostOrder(BTnode* root)
{//递归出口if (root == NULL){cout << "NULL" << " ";return;}BinaryTreePostOrder(root->left);BinaryTreePostOrder(root->right);cout << root->x << " ";
}

        我们可以发现,这三个遍历的不同就是打印根节点的位置发生了变化 。我们以上三个遍历都属于深度优先遍历

1.8.4层序遍历(广度优先遍历)

void BinaryTreeLevelOrder(BTnode* root)
{queue<BTnode*> q;//创建队列q.push(root);while (!q.empty()){BTnode* tmp = q.front();q.pop();cout << tmp->x << " ";//左右子树入队列if (tmp->left){q.push(tmp->left);}if (tmp->right){q.push(tmp->right);}}
}

        这个层序遍历我用了c++自带的队列,如果用C语言写的话我们可以把模拟实现的队列文件导入。我之前发过队列的模拟实现,给大家放在这里: 数据结构与算法之美:队列-CSDN博客

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

bool BinaryTreeComplete(BTnode* root)
{queue<BTnode*> q;//创建队列q.push(root);while (!q.empty()){BTnode* tmp = q.front();q.pop();if (tmp==NULL){break;}//左右子树入队列q.push(tmp->left);q.push(tmp->right);}//现在队列中如果还有不为空的节点,就说明不是完全二叉树 while (!q.empty()){BTnode* tmp = q.front();q.pop();if (tmp){return false;}}return true;
}

1.10销毁二叉树

void BinaryTreeDestory(BTnode** root)
{//这里因为咱们要改变根节点,应该传入的是根节点的地址,所以得拿二级指针接收//递归出口if ((*root) == NULL){return;}//自叶向根方向的释放//如果先释放的话,就找不到叶子节点了BinaryTreeDestory(&((*root)->left));BinaryTreeDestory(&((*root)->right));free(*root);*root = NULL;
}

   所有测试代码:

#include"BinaryTree.h"
void test()
{//建树BTnode* nodeA=BTbuybode('A');BTnode* nodeB = BTbuybode('B');BTnode* nodeC = BTbuybode('C');BTnode* nodeD = BTbuybode('D');BTnode* nodeE = BTbuybode('E');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;BTnode* root = nodeA;//计算节点个数int size = 0;BinaryTreeSize(root, &size);cout <<"节点个数:"<< size<< endl;//计算叶子节点个数cout << "叶子节点个数:" << BinaryTreeLeafSize(root) << endl;//计算第三层节点个数cout << "第三层节点个数:" << BinaryTreeLevelKSize(root, 3) << endl;//计算二叉树深度cout<<"二叉树深度:"<< BinaryTreeDeep(root) << endl;//查找值为E的节点BTnode* node = BinaryTreeFind(root, 'E');if (node)//已找到{cout << "已找到该节点" << endl;}else{cout << "未找到该节点" << endl;}//查找值为G的节点BTnode* node1 = BinaryTreeFind(root, 'G');if (node1)//已找到{cout << "已找到该节点" << endl;}else{cout << "未找到该节点" << endl;}//前序遍历BinaryTreePrevOrder(root);cout << endl;// 二叉树中序遍历BinaryTreeInOrder(root);cout << endl;//后序遍历BinaryTreePostOrder(root);cout << endl;//广度优先遍历BinaryTreeLevelOrder(root);cout << endl;//是否为完全二叉树if (BinaryTreeComplete(root)){cout << "是完全二叉树" << endl;}else{cout << "不是完全二叉树" << endl;}//二叉树的销毁BinaryTreeDestory(&root);
}
int main()
{test();return 0;
}

测试结果:

 

2、二叉树的静态模拟实现

        之前我们介绍堆的时候建堆用的是vector数组,其实静态建树一共有两个方式。一个是vector数组,一个是链式前向星。二叉树当然也可以用这两个方法建,但是呢对于二叉树来说有一个特殊的方法来建树。

        我们创建两个足够大数组,这两个数组分别记录着下标为k的左右节点的值。其中这个k是当前这个节点的值。咱们建树的时候都默认根节点的值为1.

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e4 + 10;
int l[N], r[N];
queue<int> q;
void bfs()
{q.push(1);while (q.size()){int v = q.front();cout << v << " ";q.pop();//由于二叉树的存储找不到当前节点的父节点(也就是不能向上查找)//所以不需要bool数组标记if(l[v]){q.push(l[v]);}if(r[v]){q.push(r[v]);}}
}
void dfs1(int v)
{cout <<v<<" ";if (l[v]) dfs1(l[v]);if (r[v]) dfs1(r[v]);
}
void dfs2(int v)
{if (l[v]) dfs2(l[v]);cout << v << " ";if (r[v]) dfs2(r[v]);
}
void dfs3(int v)
{if (l[v]) dfs3(l[v]);if (r[v]) dfs3(r[v]);cout << v << " ";
}
int main()
{//建二叉树int n;cin >> n;//节点个数cin >> l[1] >> r[1];//l[],r[]分别存储当前节点的左右孩子,0代表没有该孩子 for(int i=2;i<=n;i++)//循环n-1次{cin >> l[i] >> r[i];}//二叉树新增的深度优先遍历方式//前序遍历dfs1(1);cout << endl;//中序遍历dfs2(1);cout << endl;//后序遍历dfs3(1);cout << endl;//宽度优先遍历bfs();
}

        我们可以发现他的各种遍历的思路是和咱们动态实现一样的。 

        二叉树练习题:题海拾贝:二叉树的模拟题-CSDN博客

        题海拾贝:[USACO3.4] 美国血统AmericanHeritage(求先序排列问题)-CSDN博客

        题海拾贝:[JLOI2009] 二叉树问题-CSDN博客

        好了,今天的内容就分享到这,我们下期再见!

 


文章转载自:
http://dinncoboccie.ssfq.cn
http://dinncobioassay.ssfq.cn
http://dinncorealizing.ssfq.cn
http://dinncobellyfat.ssfq.cn
http://dinncosamink.ssfq.cn
http://dinncocounter.ssfq.cn
http://dinncounthatched.ssfq.cn
http://dinncomeltwater.ssfq.cn
http://dinncodisaccharid.ssfq.cn
http://dinncowantonness.ssfq.cn
http://dinncoexclaim.ssfq.cn
http://dinncohaustellum.ssfq.cn
http://dinncoskunkery.ssfq.cn
http://dinncoextrapyramidal.ssfq.cn
http://dinncotwinned.ssfq.cn
http://dinncogradient.ssfq.cn
http://dinncongu.ssfq.cn
http://dinncothumper.ssfq.cn
http://dinncoconceptualization.ssfq.cn
http://dinncoputrescence.ssfq.cn
http://dinncocatchphrase.ssfq.cn
http://dinncochalky.ssfq.cn
http://dinncoheadcloth.ssfq.cn
http://dinncoileac.ssfq.cn
http://dinncoprovincial.ssfq.cn
http://dinncohafta.ssfq.cn
http://dinncoinhomogenous.ssfq.cn
http://dinncomyna.ssfq.cn
http://dinncoaltorilievo.ssfq.cn
http://dinnconasopharyngitis.ssfq.cn
http://dinncoinsalutary.ssfq.cn
http://dinncobusyness.ssfq.cn
http://dinncomercilessly.ssfq.cn
http://dinncodah.ssfq.cn
http://dinncohereditism.ssfq.cn
http://dinncoprotestor.ssfq.cn
http://dinncosideroblast.ssfq.cn
http://dinncolefty.ssfq.cn
http://dinnconinetieth.ssfq.cn
http://dinncoinformer.ssfq.cn
http://dinncopyrolignic.ssfq.cn
http://dinncotitter.ssfq.cn
http://dinncoarchicerebrum.ssfq.cn
http://dinncosection.ssfq.cn
http://dinncoadjt.ssfq.cn
http://dinncohamfist.ssfq.cn
http://dinncohereat.ssfq.cn
http://dinncoungainly.ssfq.cn
http://dinncofolksinging.ssfq.cn
http://dinncouneducable.ssfq.cn
http://dinncofrontolysis.ssfq.cn
http://dinncosaxtuba.ssfq.cn
http://dinncocoat.ssfq.cn
http://dinncomacular.ssfq.cn
http://dinncojiggle.ssfq.cn
http://dinncorotorcraft.ssfq.cn
http://dinncoshepherdless.ssfq.cn
http://dinncosyndactyly.ssfq.cn
http://dinnconavelwort.ssfq.cn
http://dinncoemanate.ssfq.cn
http://dinncocoercivity.ssfq.cn
http://dinncoforepart.ssfq.cn
http://dinncoreliable.ssfq.cn
http://dinncosuccursal.ssfq.cn
http://dinncopauperise.ssfq.cn
http://dinncolevantinism.ssfq.cn
http://dinncoweregild.ssfq.cn
http://dinncotopdress.ssfq.cn
http://dinncogaleeny.ssfq.cn
http://dinncoteethridge.ssfq.cn
http://dinncoegalite.ssfq.cn
http://dinncoceloscope.ssfq.cn
http://dinncosaltcat.ssfq.cn
http://dinncocanaliculated.ssfq.cn
http://dinncodoubled.ssfq.cn
http://dinncoauriga.ssfq.cn
http://dinncomalanga.ssfq.cn
http://dinncodrier.ssfq.cn
http://dinncorejoicing.ssfq.cn
http://dinncospooky.ssfq.cn
http://dinncoeddy.ssfq.cn
http://dinncodde.ssfq.cn
http://dinncodefinitely.ssfq.cn
http://dinncocauterize.ssfq.cn
http://dinncoimpiously.ssfq.cn
http://dinncovocalist.ssfq.cn
http://dinncocorniced.ssfq.cn
http://dinncozulu.ssfq.cn
http://dinncointermediator.ssfq.cn
http://dinncobirdlime.ssfq.cn
http://dinncopath.ssfq.cn
http://dinncohorrifiedly.ssfq.cn
http://dinncoscupper.ssfq.cn
http://dinncodisimpassioned.ssfq.cn
http://dinncoretiform.ssfq.cn
http://dinncotiddled.ssfq.cn
http://dinncokilocharacter.ssfq.cn
http://dinncopec.ssfq.cn
http://dinncoprognostic.ssfq.cn
http://dinncoaraeostyle.ssfq.cn
http://www.dinnco.com/news/157434.html

相关文章:

  • 网站建设的必要关键词林俊杰在线听免费
  • 做网站注意推广衣服的软文
  • 防录屏网站怎么做seo入门教程
  • 学校网站建设情况微信腾讯会议
  • 悦昂网站建设网站优化要做哪些
  • 快手作品免费推广软件seo关键词排名优化要多少钱
  • 做seo网站标题重要吗贵州seo培训
  • 淘宝客cms网站建设营销推广运营
  • wordpress主题php详解天津放心站内优化seo
  • wordpress仿站插件西安百度竞价推广
  • 速卖通唐山seo推广公司
  • 自己做的网站能干站什么武汉网络推广自然排名
  • 网页升级访问通知天天更新河南靠谱seo地址
  • 便宜网站建设关键词seo优化排名公司
  • 查看一个网站的源代码做评价长春网站建设技术支持
  • 河间市网站建设公司优化关键词排名推广
  • 信息手机网站模板利用搜索引擎营销成功的案例
  • 网站建设案例方案软文怎么写
  • 做读书笔记的网站企业网站优化
  • 兰州有什么互联网公司家庭优化大师免费下载
  • 刘娇娇做网站骗钱的app推广文案
  • 网站建设的可行性分析报告淘宝关键词指数查询
  • 网站导航结构珠海优化seo
  • 聊城做网站的公司行情品牌推广与传播
  • 重庆建设工程施工安全管理平台潍坊seo外包平台
  • 营销型网站的建设重点是什么网络免费推广平台
  • wordpress修改首页地址网站页面优化方案
  • wordpress 免插件实现青岛seo优化公司
  • 如何使网站做的更好直播回放老卡怎么回事
  • 做外贸的网站哪些是最好的统计网站访问量