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);}

数据结构之二叉树基本操作相关推荐

  1. 数据结构 【实验7 二叉树基本操作】

    实验7   二叉树基本操作 实验目的 1.  熟悉二叉树结点的结构和对二叉树的基本操作. 2.  掌握对二叉树每一种操作的具体实现. 3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法 ...

  2. 数据结构实验 二叉树的基本操作

    数据结构实验 二叉树的基本操作 实验环境: Visual C++ 实验目的: 1.掌握二叉树的定义: 2.掌握二叉树的基本操作,如二叉树的建立.遍历.结点个数统计.树的深 度计算等. 实验内容: 用递 ...

  3. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

  4. C站万字详解二叉树基本操作演示程序(附图)

    文章目录 一.实验环境 二.设计需求分析 三.实际设计思路 四.对象与功能剖析 五.代码实现及算法思路分析 BinaryTree包 [二叉树节点类(TreeNode)] [二叉树类(Tree)] [字 ...

  5. 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...

    后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...

  6. 【数据结构】二叉树及其相关操作

    二叉树的定义 二叉树是一个由结点构成的有限集合,这个集合或者为空,或者由一个根节点及两棵互不相交的分别称作这个根节点的左子树和右子树的二叉树组成. 二叉树并非一般的树形结构的特殊形式,它们是两种不同的 ...

  7. 数据结构之二叉树(遍历、建立、深度)

    数据结构之二叉树(遍历.建立.深度) 1.二叉树的深度遍历 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树的所有结点,使得每个结点被访问一次且仅被访问一次. 对于二叉树的深度遍历,有前序遍历 ...

  8. python数据结构 树_python数据结构之二叉树的建立实例

    先建立二叉树节点,有一个data数据域,left,right 两个指针域 复制代码 代码如下: # -*- coding: utf - 8 - *- class TreeNode(object): d ...

  9. 【关于封装的那些事】 缺失封装 【关于封装的那些事】 泄露的封装 【关于封装的那些事】 不充分的封装 【图解数据结构】二叉查找树 【图解数据结构】 二叉树遍历...

    [关于封装的那些事] 缺失封装 目录 - 缺失封装 为什么不能缺失封装? 缺失封装潜在的原因 未意识到关注点会不断变化 混合关注点 幼稚的设计决策 示例分析一 示例分析二 总结 缺失封装 没有将实现变 ...

最新文章

  1. 阿里巴巴副总裁司罗:达摩院如何搭建NLP技术体系?
  2. AWS — AWS Direct Connect
  3. MySql安装后在服务管理器里边找不到MySql服务项的解决办法(win10)
  4. 建立ARM交叉编译环境 (arm-none-linux-gnueabi-gcc with EABI)
  5. Android 小技巧
  6. python fork 守护进程
  7. pageContext对象和config对象
  8. 结构计算机分析,计算机系统结构 (三) CPU及其结构分析
  9. j2ee 简单网站搭建:(十)jquery ztree 插件使用入门
  10. Ubuntu搭建tftp服务器
  11. 利用BP神经网络预测水道浅滩演变
  12. ubuntu mysql开发_Ubuntu下进行基于MySQL的JDBC的开发
  13. 微软总部首席测试专家做客中关村图书大厦“说法”
  14. awakeFromNib 与 viewDIdLoad 自己小结
  15. matlab下载安装教程
  16. 键盘锁定了,无法输入是什么原因?
  17. 中山大学2021级研究生学术道德规范在线考试学习资料
  18. 网信耕耘十余载,金融安全3.0时代的缔造者
  19. 一场云端的“神仙打架”:BAT加华为的影响未来之争
  20. 安卓Android校园综合服务系统校园帮app

热门文章

  1. 大学生开学必备物品清单男生2022 大学生开学必备物品男生
  2. linux 实验 ps,OS第1次实验报告:熟悉使用Linux命令和剖析ps命令
  3. emui和鸿蒙哪个好,今天升级了鸿蒙系统,使用起来还真是传说中的顺滑,比之前的Emui好用。...
  4. 服务器系统漏洞与补丁程序,巧打补丁保护服务器安全
  5. 聊聊RSNA2017上的机器学习
  6. GitLab服务器安装完成之后;瓦力系统的安装(之一)
  7. ICG-Maleimide|吲哚菁绿-马来酰亚胺|开发共轭物
  8. 树莓派无显示器连接无线
  9. 孙宇晨为恶俗炒作道歉;华为回应美国子公司裁员 600
  10. WaitForMultipleObjects的疑惑