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

旅游网站模板 手机百度搜索这个网站为什么这么差

旅游网站模板 手机,百度搜索这个网站为什么这么差,巨鹿建设银行网站首页,python可以做网站么概述:本篇博客主要介绍链式结构二叉树的实现。 目录 1.实现链式结构二叉树 1.1 二叉树的头文件(tree.h) 1.2 创建二叉树 1.3 前中后序遍历 1.3.1 遍历规则 1.3.1.1 前序遍历代码实现 1.3.1.2 中序遍历代码实现 1.3.1.3 后序遍历代…

概述:本篇博客主要介绍链式结构二叉树的实现。

目录

1.实现链式结构二叉树

1.1 二叉树的头文件(tree.h)

1.2 创建二叉树 

 1.3 前中后序遍历

1.3.1 遍历规则 

1.3.1.1 前序遍历代码实现

1.3.1.2  中序遍历代码实现

1.3.1.3  后序遍历代码实现

 1.4 二叉树结点的个数

 1.5 二叉树叶子结点个数

1.6  二叉树第k层结点个数

1.7  二叉树的深度/高度

​编辑

 1.8 查找值为x的结点

1.9 二叉树的销毁 

2. 小结 


1.实现链式结构二叉树

1.1 二叉树的头文件(tree.h)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//定义链式结构二叉树
//二叉树结点的结构
typedef char BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;//前序遍历
void preOrder(BTNode* root);
//中序遍历
void InOrder(BTNode* root);
//后序遍历
void postOrder(BTNode* root);//二叉树结点个数
int BinaryTreeSize(BTNode* root);
//void BinaryTreeSize(BTNode* root,int* psize);//二叉树叶子结点个数
int BinaryTreeLeafSize(BTNode* root);//二叉树第k层结点个数
int BinaryTreeLevelKSize(BTNode* root, int k);//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root);//二叉树查找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);//二叉树销毁
void BinaryTreeDestroy(BTNode** root);//层序遍历
void LevelOrder(BTNode* root);//判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root);
1.2 创建二叉树 

 用链表来表示一颗二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址,其结构如下:

//定义链式结构二叉树
//二叉树结点的结构
typedef char BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;  // 指向当前结点左孩子struct BinaryTreeNode* right; // 指向当前结点右孩子
}BTNode;

二叉树的创建方式比较复杂,为了更好走进二叉树的学习中,我们先手动构建一颗链式二叉树。 

#include"Tree.h"
BTNode* buyNode(char x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));node->data = x;node->left = node->right = NULL;return node;
}
BTNode* creatBinaryTree()
{BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
}

回顾二叉树的概念,二叉树分为空树和非空二叉树非空二叉树根结点根结点的左子树根结点的右子树组成的。 

 

 根结点的左子树和右子树分别又是由子树结点、子树结点的左子树子树结点的右子树组成的,因此二叉树定义式递归式的,后续链式二叉树的操作基本都是按照该概念实现的。

 1.3 前中后序遍历

二叉树的操作离不开树的遍历,我们先来看一下二叉树的遍历有哪些方式。 

 

1.3.1 遍历规则 

 按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

1)前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发生在遍历其左右子树之前

访问顺序为:根结点、左子树、右子树

 2)中序遍历(Inorder Traversal):访问根结点的操作发⽣在遍历其左右子树之中(间)

访问顺序为:左子树、根结点、右子树 

3)后序遍历(Postorder Traversal):访问根结点的操作发生在遍历其左右子树之后

 访问顺序为:左子树、右子树、根结点

1.3.1.1 前序遍历代码实现
void preOrder(BTNode* root)
{if(root == NULL){printf("NULL ");return;}printf("%c ", root->data);preOrder(root->left);preOrder(root->right);
}

逻辑概述: 

 这段 代码定义了一个先序遍历二叉树的函数 `preOrder`。函数的参数是一个指向二叉树节点的指针 `root`。

如果 `root` 为空,函数会输出 `NULL` 并返回。否则,函数会先输出当前节点的数据,然后对左子树和右子树分别递归调用 `preOrder` 函数进行先序遍历。

在代码中,`printf("%c ", root->data);` 用于输出当前节点的数据,假设 `data` 是字符类型。 

1.3.1.2  中序遍历代码实现
void InOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}InOrder(root->left);printf("%c ", root->data);InOrder(root->right);
}

逻辑概述: 

这段代码是一个二叉树的中序遍历函数。其功能是:如果根节点为空,输出"NULL "并返回;否则,先对左子树进行中序遍历,然后输出根节点的数据,最后对右子树进行中序遍历。其实现过程与常见的二叉树中序遍历的逻辑一致。 

1.3.1.3  后序遍历代码实现
void postOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}postOrder(root->left);postOrder(root->right);printf("%c ", root->data);
}

逻辑概述: 

 这段代码定义了一个二叉树的后序遍历函数 `postOrder` 。函数的作用是:如果根节点为空,输出 `"NULL "` 并返回;否则,先对左子树进行后序遍历,再对右子树进行后序遍历,最后输出根节点的数据。这符合二叉树后序遍历的逻辑,即先遍历左子树,再遍历右子树,最后访问根节点。 

 1.4 二叉树结点的个数
int BinaryTreeSize(BTNode* root)
{if (root == NULL){return 0;}if (root->left == NULL && root->right == NULL){return 1;}return 1 + BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

逻辑概述: 

 这段代码定义了一个计算二叉树节点个数的函数 `BinaryTreeSize` 。

函数的逻辑是如果根节点为空,返回 0;如果根节点的左右子树都为空,返回 1;否则,返回 1 加上左子树的节点个数和右子树的节点个数。其中,左子树和右子树的节点个数通过递归调用 `BinaryTreeLeafSize` 函数来计算。 

 

 1.5 二叉树叶子结点个数
//二叉树叶子结点个数
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);
}

 逻辑概述:

 这段代码定义了一个计算二叉树叶子结点个数的函数`BinaryTreeLeafSize`

函数的逻辑是:如果根节点为空,返回0;如果根节点的左右子树都为空,说明该节点为叶子节点,返回1;否则,通过递归调用函数本身分别计算左子树和右子树的叶子节点个数,并将它们相加后返回。 

1.6  二叉树第k层结点个数
// 计算二叉树第 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);
}

 逻辑概述:

这段代码的功能是计算二叉树中第k层的节点个数如果根节点为空,返回0。如果k等于1说明当前根节点就是第k层的节点,返回1否则,通过递归调用函数本身,分别计算左子树和右子树中第k - 1层的节点个数,并将它们相加后返回。

1.7  二叉树的深度/高度
//二叉树的深度/高度
int BinaryTreeDepth(BTNode* root)
{if (root == NULL){return 0;}int leftDep = BinaryTreeDepth(root->left);int rightDep = BinaryTreeDepth(root->right);return 1 + (leftDep > rightDep ? leftDep : rightDep);
}

逻辑概述: 

 这段代码定义了一个计算二叉树深度(高度)的函数 `BinaryTreeDepth` 。

函数的逻辑是:如果根节点为空,返回 0 。然后分别计算左子树和右子树的深度,记为 `leftDep` 和 `rightDep` 。最后,二叉树的深度为 1 加上 `leftDep` 和 `rightDep` 中的较大值。 

 1.8 查找值为x的结点
//二叉树查找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode* leftFind = BinaryTreeFind(root->left, x);if (leftFind){return leftFind;}BTNode* rightFind = BinaryTreeFind(root->right, x);if (rightFind){return rightFind;}return NULL;
}

逻辑概述: 

 这段代码定义了一个在二叉树中查找值为`x`的节点的函数`BinaryTreeFind`。

函数的执行过程如下:
- 如果根节点为空,直接返回`NULL`,表示未找到。
- 如果根节点的值等于`x`,则返回根节点。
- 然后在左子树中递归查找值为`x`的节点,如果找到则返回该节点。
- 如果在左子树中未找到,再在右子树中递归查找值为`x`的节点,如果找到则返回该节点。
- 如果在整个二叉树中都未找到值为`x`的节点,则最终返回`NULL`。 

1.9 二叉树的销毁 
//二叉树销毁
void BinaryTreeDestroy(BTNode** root)
{if (*root == NULL){return;}BinaryTreeDestroy(&((*root)->left));BinaryTreeDestroy(&((*root)->right));*root == NULL;
}

2. 小结 

以上便是本篇博客的所有内容了,如果这篇博客能给大家带来知识,还请大家多多点赞。 


文章转载自:

http://oK34pOlV.xcpft.cn
http://1HaZzpKN.xcpft.cn
http://WFxJ2T9q.xcpft.cn
http://WXr9d239.xcpft.cn
http://iaRW7c3i.xcpft.cn
http://x8cyvENd.xcpft.cn
http://rXu1okl4.xcpft.cn
http://uAIrTVxe.xcpft.cn
http://t8QVHE0M.xcpft.cn
http://hBcy5TBW.xcpft.cn
http://YwAlo49p.xcpft.cn
http://32mRO6IZ.xcpft.cn
http://7hNacSnn.xcpft.cn
http://736hzTjc.xcpft.cn
http://JZwc71Rl.xcpft.cn
http://iW5hDOGo.xcpft.cn
http://ie0jd3bF.xcpft.cn
http://J7KvMrG4.xcpft.cn
http://dV2xS1Mp.xcpft.cn
http://kRsqtus0.xcpft.cn
http://Y7XsPWMR.xcpft.cn
http://innyrQls.xcpft.cn
http://ztT811kN.xcpft.cn
http://7MwvkLfH.xcpft.cn
http://OHhCEAMr.xcpft.cn
http://6bYZFfHo.xcpft.cn
http://vBAwyC47.xcpft.cn
http://0xRfcQys.xcpft.cn
http://JgeTWCd3.xcpft.cn
http://anW7Fvue.xcpft.cn
http://www.dtcms.com/wzjs/759586.html

相关文章:

  • 网站制作 商城wordpress插件升级
  • 网站分析 工具策划方案
  • 建设网站的重点与难点在于十大平面设计公司
  • 衡水林熠网站建设公司Wordpress页面打开慢
  • 专门做二手书网站或app上海住房和城乡建设部网站
  • 永州网站建设gwtcms个人备案网站可以做商城吗
  • 太原建站网站模板正规的丹阳网站建设
  • 中国建设银行浙江省丽水市分行网站wordpress阿里百秀主题
  • 简单的php购物网站源码做的网站打印全乱掉了
  • 网站展示效果图凡科建站网页版
  • 网站开发合同缴纳印花税吗app开发哪家好
  • 做企业网站需要什么文件wordpress精美免费主题
  • 建网站的公司哪里有wap网站还用吗
  • es网站开发wordpress怎么添加管理员
  • 滁州网站建设信息推荐旅游网络营销方式
  • 北京网站建设过程毕节市建设厅网站
  • 龙岗区住房和建设局网站打不开软件开发公司网站模板
  • 南宁市网站建设性能网站建设
  • 外贸建站有什么用建设网站价格
  • 如何更改公司网站内容网站做优化的必要性
  • 网站还未被收录可以做推广吗学网站前端
  • 网站建设工程师证书北京高端网站设计公司
  • 建站哪家技术好wordpress如何生成网站地图
  • 付费ppt模板网站哪个好网页设计要学所有软件吗
  • 佛山seo网站wordpress官方源文件结构
  • 浙江做网站公司深圳最新消息
  • 移动端网站建设原则天长做网站
  • 网站header设计江门桂城网站建设
  • 设计优秀网站作品秦皇岛网站开发
  • 专业网站制作案例苏州网站推广服务