数据结构之二叉树基本操作
1,二叉树的定义:
typedef struct node
{int data;struct node *lchild;struct node *rchild;
}Node;typedef struct { //树根Node* root;
} Tree;
注:二叉树创建为什么要用二级指针???
调用者的变量需要被修改内容,这里是root(指向Tree类型的指针),Tree需要指向一个新插入的节点,也就是需要修改root的值。所以 应该传入指向root的地址。这样在被调用的函数中,对Tree的操作等价于操作root。否则Tree如果是和root类型一样的Node类型 的指针,和root位于两个不同的内存,Tree只是被初始化为root的值,之后对Node的操作不会影响root。
2,二叉树的创建
void insert(Tree* tree, int value)//创建树
{//node尾插入节点Tree* node=(Tree*)malloc(sizeof(Tree));//创建一个节点node->data = value;node->left = NULL;node->right = NULL;if (tree->root == NULL)//判断树是不是空树{tree->root = node;}else {//不是空树Node* temp = tree->root;//从树根开始while (temp != NULL){if (value < temp->data)//小于就进左儿子{if (temp->left == NULL){temp->left = node;return;}else {//继续判断temp = temp->left;}}else {//否则进右儿子if (temp->right == NULL){temp->right = node;return;}else {//继续判断temp = temp->right;}}}}return;
}
3,二叉树的遍历
//中序
void InOrderTree(Tree root) {if (root == NULL) {return;}InOrderTree(root->left);printf("%d ", root->data);InOrderTree(root->right);
}//先序
void PreOrderTree(Tree root) {if (root == NULL) {return;}printf("%d ", root->data);PreOrderTree(root->left);PreOrderTree(root->right);
}//后序
void PostOrderTree(Tree root) {if (root == NULL) {return;}PostOrderTree(root->left);PostOrderTree(root->right);printf("%d ", root->data);
}
4,二叉树关键字的查找
//非递归Tree SearchBSTree( Tree pBST,int key) //版本1{while(NULL != pBST && key != pBST ->data){ if(key < pBST ->data)pBST = pBST ->pLchild;elsepBST = pBST ->pRchild ;} return pBST;}//递归
Tree SearchBSTree(Tree pBST,int key) //版本2{if(NULL == pBST) return NULL;else if(key < pBST ->data) return SearchBSTree(pBST ->pLchild,key);else if(key > pBST ->data)return SearchBSTree(pBST ->pRchild,key);elsereturn pBST;
}
5,二叉树的深度
int maxDepth(Tree root) {if (root == NULL) {return 0;}else {int maxLeft = maxDepth(root->left);int maxRight = maxDepth(root->right);if (maxLeft > maxRight) {return 1 + maxLeft;}else {return 1 + maxRight;}}
}
6,二叉树节点的删除
void DeleteBynum(Tree bt,int key)
{Tree L,LL; //在删除左右子树都有的结点时使用;Tree p=bt;Tree parent=bt;int child=0; //0表示左子树,1表示右子树;if(!bt) //如果排序树为空,则退出;return ;while(p) //二叉排序树有效;{//1,叶结点(左右子树都为空);if(p->data==key){if(!p->lchild&&!p->rchild) {if(p==bt) //被删除的结点只有根结点;free(p);else if(child==0){parent->lchild=NULL; //设置父结点左子树为空;free(p); //释放结点空间;}else //父结点为右子树;{parent->rchild=NULL; //设置父结点右子树为空;free(p); //释放结点空间;}}//2,左子树为空,右子树不为空;else if(!p->lchild) {if(child==0) //是父结点的左子树;parent->lchild=p->rchild;else //是父结点的右子树;parent->rchild=p->rchild;free(p); //释放被删除的结点;}//3,右子树为空,左子树不为空;else if(!p->rchild) {if(child==0) //是父结点的左子树;parent->lchild=p->lchild;else //是父结点的右子树;parent->rchild=p->lchild;free(p); //释放被删除的结点;}//4,左右子树都不为空else{LL=p; //保存左子树的结点;L=p->rchild; //从当前结点的右子树进行查找;if(L->lchild) //左子树不为空;{LL=L;L=L->lchild; //查找左子树;p->data=L->data; //将左子树的数据保存到被删除结点;LL->lchild=L->lchild; //设置父结点的左子树指针为空;for(;L->lchild;L=L->lchild);L->lchild=p->lchild;p->lchild=NULL;}else{p->data=L->data;LL->rchild=L->rchild;}}p=NULL;}else if(key<p->data) //需删除记录的关键字小于结点的数据;{//要删除的结点p是parent的左子树;child=0; //标记在当前结点左子树;parent=p;//保存当前结点作为父结点;p=p->lchild; //查找左子树;}else //需删除记录的关键字大于结点的数据;{//要删除的结点p是parent的右子树;child=1; //标记在当前结点右子树查找;parent=p; //保存当前结点作为父结点;p=p->rchild; //查找右子树;}}
}
7,叶子节点个数统计
int LeafNodeNum(t Tree root)
{if (root == NULL) {return 0;}if (root->left == NULL&&root->right == NULL) {return 1;}else {return LeafNodeNum(root->left) + LeafNodeNum(root->right);}
数据结构之二叉树基本操作相关推荐
- 数据结构 【实验7 二叉树基本操作】
实验7 二叉树基本操作 实验目的 1. 熟悉二叉树结点的结构和对二叉树的基本操作. 2. 掌握对二叉树每一种操作的具体实现. 3. 学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法 ...
- 数据结构实验 二叉树的基本操作
数据结构实验 二叉树的基本操作 实验环境: Visual C++ 实验目的: 1.掌握二叉树的定义: 2.掌握二叉树的基本操作,如二叉树的建立.遍历.结点个数统计.树的深 度计算等. 实验内容: 用递 ...
- 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验
实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...
- C站万字详解二叉树基本操作演示程序(附图)
文章目录 一.实验环境 二.设计需求分析 三.实际设计思路 四.对象与功能剖析 五.代码实现及算法思路分析 BinaryTree包 [二叉树节点类(TreeNode)] [二叉树类(Tree)] [字 ...
- 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...
后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...
- 【数据结构】二叉树及其相关操作
二叉树的定义 二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成. 二叉树并非一般的树形结构的特殊形式,它们是两种不同的 ...
- 数据结构之二叉树(遍历、建立、深度)
数据结构之二叉树(遍历.建立.深度) 1.二叉树的深度遍历 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树的所有结点,使得每个结点被访问一次且仅被访问一次. 对于二叉树的深度遍历,有前序遍历 ...
- python数据结构 树_python数据结构之二叉树的建立实例
先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...
- 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...
[关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...
最新文章
- 我一顿操作把电脑弄崩了!!!数据全没了!!!我该怎么办?
- 计算机删除百度云盘图标,win10系统百度云盘图标删除的操作方法
- 2 创建联合索引_想进大厂,这些Mysql索引底层知识你是必须知道的
- 【HDU - 5605】 geometry(水,数学题,推公式)
- (十七)深入浅出TCPIP之HTTP和HTTPS
- inline行内元素
- 事务的基本概念,Mysql事务处理原理
- dp(0,1背包)-----高数Umaru系列(9)——哈士奇
- Android Studio配置,加快编译速度
- 偏微分方程数值解法python_微分方程 | 常微分
- ubuntu安装matlab2016b
- python opencv图像对比度_OpenCV基础(四)---图像对比度,亮度调整
- 学生环境保护绿色家园 WEB静态网页作业模板 大学生环境保护网页代码 dreamweaver网页设计作业制作 dw个人网页作业成品
- 谷歌浏览器翻译插件的安装与使用
- 四则运算之结对作业报告
- 时间序列--残差分析
- C语言求某天是一年里的第几天(详细)
- 怎么屏蔽百度搜索时的百度热榜?
- linux pv命令,linux运维系列pv指令
- 新CSDN文章转成PDF、打印(去空白)