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

做玄幻封面素材网站海报设计在线生成

做玄幻封面素材网站,海报设计在线生成,网站怎么添加软件,黄山网站建设黄山树是数据结构中非常重要的一种,在计算机的各方个面都有他的身影 此篇文章主要介绍二叉树的基本操作 目录 二叉树的定义:二叉树的创建:二叉树的遍历:前序遍历:中序遍历:后序遍历: 二叉树节点个数…

树是数据结构中非常重要的一种,在计算机的各方个面都有他的身影
此篇文章主要介绍二叉树的基本操作

目录

  • 二叉树的定义:
  • 二叉树的创建:
  • 二叉树的遍历:
    • 前序遍历:
    • 中序遍历:
    • 后序遍历:
  • 二叉树节点个数:
  • 二叉树叶子结点个数:
  • 二叉树第k层节点个数:
  • 二叉树查找值为x的节点:
  • 二叉树的销毁:

二叉树的定义:

这里我们使用char,因为二叉树的创建我们会使用递归创建,需要传入一个字符串进行操作

typedef char BTDataType;typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;

二叉树的创建:

我们通过前序遍历的数组"123###45##6##"构建二叉树
在这里插入图片描述

这里讲一下我使用递归做题时的一些做题感受方法:

  • 首先写出递归的结束条件,这是每个递归都不可以缺少的
  • 利用分治的思想(将一个问题分成几个相同的子问题)
  • 把你的递归想象是可以完成你既定的任务
  • 写出你调用这个递归需要本次进行的工作
  • 完成后可以画出一个递归展开图进行验证

接下来我会仔细带着大家仔细领悟,熟能生巧,同学们一定不要气馁

先解释一下这个函数传参的意义:

BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
a就是我们传参的字符数组
pi是我们字符数组的下标,为什么需要下标的地址呢,因为形参的改变不会影响实参
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{if (a[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode));if (root == NULL){perror("malloc fail");return;}root->data = a[(*pi)++];root->left = BinaryTreeCreate(a, pi);root->right = BinaryTreeCreate(a, pi);return root;
}
  1. 做递归时截止条件是必不可少的,我们选择使用叶子节点是否为空作为判断标准。
  2. 我们将这个问题从创建一个完整二叉树分成先创建一个节点并连接他的左右节点的问题·
  3. 我们现在需要完成此时函数需要完成的任务,此次函数的目的是创造一个二叉树,我们需要对root->val进行赋值,再将root的左右子树进行连接
  4. 此时观察整个函数,我们发现我们已经生成了一个root节点,也进行了赋值,root的左右节点也都分别使用BinaryTreeCreate(a, n, pi)这个函数进行连接,我们已经把此函数当做可以完成既定任务的,不需要过多纠结,此时我们在加一个返回值root,就完成了此次函数的创建

二叉树的递归图:

在这里插入图片描述
大家也可以自己动手画一下递归展开图

二叉树的遍历:

前序遍历:

有了以上的思路就可以很简单的实现了

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

代码也很简洁

  1. NULL结束条件
  2. 分治:前序是根左右的遍历,故我们先遍历根,在遍历左子树右子树
  3. 没有返回值,不需要return
就像下图这样,将这个程序当成可以完成任务的函数。printf("%c ", root->data);//进行本次的任务BinaryTreePrevOrder(root->left);//遍历左子树BinaryTreePrevOrder(root->right);//遍历左子树

中序遍历:

与前序遍历一致

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

后序遍历:

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

二叉树节点个数:

int BinaryTreeSize(BTNode* root)
{if (root == NULL){return 0;}return BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}
  1. 结束条件为NULL
  2. 分治:将这个问题当成当前节点+左子树节点与右子树节点
  3. return 当前节点+左子树节点与右子树节点

二叉树叶子结点个数:

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. 结束条件有两个(因为当前节点不为空节点才能是叶子节点),为空或为叶子节点
  2. 分治:将问题变为左子树的叶子节点与右子树的叶子结点
  3. 返回总结点个数

二叉树第k层节点个数:

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

1.结束条件有两个,当为NULL或为目标层数时为结束
2. 分治:这个的分治并不像上边的简单了,我们需要root的第k层转化为root->左子树的k-1层与root->right的k-1层,将K也作为函数传参,每次减1
3. 返回第k层节点个数

二叉树查找值为x的节点:

我们先来看这样一段代码,相信有许多小伙伴在遇到

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

乍一看好像没什么问题,不就是前序遍历嘛,
不然,实则我们并没有记录找到的地址,像下图一样
在这里插入图片描述

BTNode* BinaryTreeFind(BTNode* root, BTDataType 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;
}
  1. 结束为NULL目标值
  2. 分治:当前节点+左子树+右子树进行前序遍历
  3. 记录ret值并返回

二叉树的销毁:

使用后序遍历,因为前序与中序需要记录当前被销毁的左右节点地址

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

持续更新中…

http://www.yayakq.cn/news/172768/

相关文章:

  • 台州网站建站服务哪家奿最近热搜新闻事件
  • 网站建设费用如何做账务处理网站建设需要机房服务器
  • 可做笔记的阅读网站贵州省住房和城乡建设厅网站官网
  • 邯郸网站建设网页设计网络推广长春餐饮网站建设
  • 深圳微信网站公司哪家好股市行情app
  • 在家做的手工活哪里有网站wordpress 小米官网主题下载
  • 江西网站开发企业重庆做网站制作公司
  • 专业的营销网站建设公司排名邯郸企业做网站费用
  • 重庆seo整站优化系统房屋租赁合同
  • 淘宝基地网站怎么做做网站域名哪里来
  • 万网网站根目录做俄罗斯外贸的网站设计
  • 虚拟机上做钓鱼网站网站开发的企业
  • 网站开发行业工作交接交接哪些给网站做公正需要带什么
  • 成都温江网站建设怎么给自己制作一个网站
  • 什么网站可以免费做兼职舆情app免费
  • 导航网站超链接如何做商丘三合一网站建设
  • 制作一个买股票的网站怎么做营销网站定制
  • 网站图片用什么格式深圳seo优化公司搜索引擎优化方案
  • 一站式服务就像一个什么营销型网站建设案例
  • 藁城 网站济南网站建设 首选搜点网络
  • 莆田建站培训帮人做网站收费合法吗
  • 固阳网站建设广州调查公司
  • 网站开发能赚钱吗做网站合同范本
  • 英文 edm营销 的网站 与 工具wordpress 用户上传头像
  • 专业做网站公司排名保定网站排名
  • 做网页和做网站的区别网站无法下载视频 怎么做
  • 找人建设一个网站大概需要多少费用电商系统开发公司
  • 沈阳网站建设优秀公司企业运营公司
  • html5网站报价明细网站怎么搜
  • ps加dw做网站免费建站系统下载