• 基本操作
    • 给某结点插入一个左孩子
    • 删除二叉树中某结点的左子树
    • 根据先序与中序遍历建立二叉树
  • 应用举例
    • 查找数据元素
    • 二叉链表存储结构 统计叶结点的数目

基本操作

通常有:建立空二叉树、生成以X为根节点的数据域信息、将数据域信息为x的结点插入到二叉树bt中、删除某一个结点的左子树/右子树、查找某元素、遍历

给某结点插入一个左孩子

btnode<DataType>*btTree::Insert(btTree bt,DataType x,BtTree parent){//在二叉树bt中的parent所指结点和其左子树中 插入数据元素为x的结点
btTree p;
if(parent==NULL){return NULL;//如果不存在parent结点,不能进行插入,返回空指针
}
p=new btnode;//申请结点空间
if(p==NULL) return NULL;//如果没有存储空间,返回空指针
p->data=x;
p->lchild=NULL;
P->rchild=NULL;//建立待插入结点
if(parent->lchild==NULL)parent->lchild=p;//如果parent没有左孩子,直接插入
else
{p->lchild=parent->lchild;
parent->lchild=p;//parent的左孩子作为p的左孩子插入
}
return bt;//返回根节点地址}

几个注意点:
1.要先判错,且多种情况都要考虑,parent为空的情况、p没有申请到空间的情况
2.对于parent有无子树也要分开写
3.建立待插入结点时p->data=x;
p->lchild=NULL;
P->rchild=NULL;注意左右指针域也要初始化

删除二叉树中某结点的左子树

btnode<DataType>*btTree::DeleteL(btTree L,btTree parent)
{btTree p;
if(parent==NULL||parent->lchild==NULL){return NULL;//如果不存在parent结点,不能进行插入,返回空指针
}
p=parent->lchild;
parent->lchild=NULL;
delete(p);//当p非叶子节点时,这样只释放了树根结点的空间,若要删除子树分支中的结点,还需要用到遍历
return bt;
}

注意:这里当parent为空或者没有左孩子都要返回空指针,不进行删除操作

根据先序与中序遍历建立二叉树

下面给出该算法描述。假设二叉树的先序序列和中序序列分别存放在一维数组preod[]与inod[]中,并假设二叉树各结点的数据值均不相同。
写法一:

void preInorder(char preod[],char inod[],int i,int j,int k,int h,btTree*t)
{int m;
(*t)=new btNode;
(*t)->data=preod[i];//根结点
m=k;//中序遍历中的第一个索引
while(inod[m]!=preod[i])m++;
if(m==k)t->lchild=NULL;//此时左子树序列为空
else
preInorder(preod,inod,i+1,i+m-k,k,m-1,&((*t)->lchild)));
if(m==h)//右子树序列为空
preInorder(preod,inod,i+m-k+1,j,m+1,h,&((*t)->rchild));}

写法二:

//把in_order[L1..R1]和post_order[L2..R2]建成一棵二叉树,返回树根
int build(int L1, int R1, int L2, int R2) {if (L1 > R1) return 0; //先判断特殊情况:是否为空树int root = post_order[R2];int p = L1;while (in_order[p] != root) p++;int cnt = p - L1; //左子树的结点个数lch[root] = build(L1, p - 1, L2, L2 + cnt - 1);rch[root] = build(p + 1, R1, L2 + cnt, R2 - 1);return root;
}

写法三:

void rebuild(char * preOrder,char* inOrder,int nTreeLen,Node** root)
{if(preOrder == NULL || inOrder == NULL)
{return;//先检查边界条件
}
Node*temp = new Node;//先获得前序遍历的第一个结点
temp->data = *preOrder;
temp->left = NULL;
temp->right = NULL;
if(*root == NULL) *root = temp;//如果此结点为空,则把当前结点复制到根节点
if(nTreeLen == 1) return;//如果当前树长度为1,则已经是最后一个结点
char *pOrgInorder = inOrder;
char* pLeftEnd =inOrder;//寻找子树长度
int templen = 0;//用于记录临时长度,避免溢出
while( *preOrder != * pLeftEnd ){if(preOrder ==NULL||pLeftEnd ==NULL)return;
templen ++;
if(templen > nTreeLen)break;
pLeftEnd++;
}
int LeftLen = (int)(pLeftEnd - pOrgInorder);
int RightLen =  nTreeLen - LeftLen-1;//右子树长度
if(LeftLen>0) rebuild(preOrder+1,inOrder,LeftLen;&((*root)->left));//递归重建左子树
if(RightLen>0)rebuild(preOrder+1+LeftLen,Inorder+LeftLen+1,RightLen,&((*root)->right));
}

应用举例

查找数据元素

Search(bt,x) 在bt为根结点指针的二叉树中查找数据元素x,查找成功时返回该结点的指针,失败时返回空指针

biTree Search(btNode*bt,DataType x)
{btNode*p;if(bt){if(bt->dara==x) return bt;if(bt->lchild){p=Search(bt->lchild,x);if(p) return p;}if(bt->rchild){p=Search(bt->rchild,x);if(p) return p;}}return NULL;
}

注意要验是否空指针:if(bt), if§return p;

二叉链表存储结构 统计叶结点的数目

 int CountLeaf(btNode*bt) { if(!bt) return 0;if(bt->lchild==NULL&&bt->rchild==NULL){ return 1;}return CountLeaf(bt->lchild)+CountLeaf(bt->rchild);}

【算法学习笔记】二叉树的基本操作实现和应用举例,根据先序与中序遍历建立二叉树的实现相关推荐

  1. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

  2. 算法学习笔记:简单数据结构及排序算法

    原学习视频跳转地址:https://www.bilibili.com/video/BV13g41157hK?p=2 本文为自学视频整理的简单笔记 目录 排序 冒泡排序 选择排序 插入排序 归并排序(递 ...

  3. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  4. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  5. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  6. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  7. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  8. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  9. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

最新文章

  1. Mac 环境变量配置
  2. linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞
  3. java制作扫雷游戏中埋雷的难点_月薪30K程序员花了一个小时,用c++做出经典扫雷游戏 !...
  4. MySQL基础 - 注意事项
  5. python 3.6.0新语法,Python 3.6学习笔记(附2018最新python初学者入门视频教学)
  6. Windows7中被大家忽略的实用七大功能
  7. html获取xml的数据,xml格式获取值
  8. html修改每页显示数量,JS实现动态设置每页显示固定行数
  9. 数据:FIT2CLOUD飞致云连续进入云管理软件市场权威研究报告
  10. 《有限单元法》--王勖成,习题2.12 MATLAB 程序
  11. matlab二重积分运算,matlab二重积分
  12. ubuntu和win7共享文件
  13. 推荐一款前端轻量级的toolTip插件-Tippy.js
  14. u深度重装系统详细教程_u深度u盘怎么安装深度xp系统?u深度u盘装系统教程
  15. 2的10次方-1的python表达式_第二章PythonⅠ的基本语法,python,I
  16. java excel 导出数据文件格式无效
  17. 新的一年强势推荐5个免费的在线工具
  18. 制作 Google Chrome 绿色版
  19. VMware虚拟化- vMotion 迁移原理与应用
  20. “msg“: “查询失败Text ‘2021-02-25T23:59:59‘ could not be parsed at index 10“

热门文章

  1. python多进程编程 多个函数并发执行_python并发编程之多进程编程
  2. html5数组查找第二大数,2021-06-29:在两个都有序的数组中找整体第K小的数。
  3. (转载)GET和POST两种基本请求方法的区别
  4. 华为30pro什么时候能升鸿蒙,荣耀30Pro、荣耀30Pro+什么时候升级鸿蒙系统 荣耀30Pro、荣耀30Pro+怎么升级鸿蒙系统...
  5. python qq模块_Python的nonebot模块如何获取命令发出者的QQ?
  6. kafka mysql安装与配置_Mac环境canal+mysql+kafka的安装及使用
  7. java保存数字_Java:JFormattedTextField保存数字
  8. 【机器学习算法专题(蓄力计划)】十五、机器学习中玄乎的最大熵原理及模型
  9. 前言、Python是真的火,还是炒得火?来看看它的前世和发展
  10. tensorflow从入门到放弃(二)