基本性质

5条基本性质

基操

#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef struct Binode
{int data;struct sode *lchild,*rchild;
}BiTNode,*BiTree;
//上述为二叉链表的定义/*此述为三叉链表的定义
typedef struct node
{int data;struct node *lchild,*rchild,*parent;
}JD;
*/void CreatTree(BiTree &T)
{char ch;cin>>ch;if(ch=='#')T=NULL;else{T=new BiTNode;T->data=ch;CreatTree(T->lchild);CreatTree(T->rchild);}
}viod PreOrderTraverse(BiTree T)//先序遍历+递归
{if(T){cout<<T->data;PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}
}void InOrderTraverse(BiTree T)//中序
{if(T){InOrderTraverse(T->lchild);cout<<T->data;InOrderTraverse(T->rchild);}
}void PostOrderTraverse(BiTree T)//后序
{if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);cour<<T->data;}
}int main ()
{BiTree T;CreatTree(T);InOrderTraverse(T);
return 0;
}

树高,树的叶子结点数(两类)

## 树高度
int Depth(BiTree T)
{int l=0,r=0;//左子树高,右子树高if(!T)return 0;l=Depth(T->lchild);r=Depth(T->rchild);if(l>r) return l+1;else return r+1;
}## 树的叶子结点数(不适用于森林转换成的二叉树)int Leaf(BiTree T)//不适用于森林转换成的二叉树
{if(!T)return 0;if(T->lchild=NULL&&T->rchild==NULL)//左右孩子均为空return 1;return (Leaf(T->lchild)+Leaf(T->rchild));
}## 森林转换成二叉树的叶子结点数
int Leaf(BiTree T)
{if(!T)return 0;//只要左孩子空就是叶子结点if(T->lchild=NULL)return 1+Leaf(T->rchild);else return (Leaf(T->lchild)+Leaf(T->rchild));
}

建立线索二叉树

#include <bits/stdc++.h>
using namespace std;
typedef struct BiTNode
{char data;struct BiTNode *lchild,*rchild;int ltag,rtag;
}BiTNode,*BiTree;
void CreateTree(BiTree &T)//先建树。给地址用来分配空间(?)
{char ch;cin>>ch;if(ch=='@')T=NULL;else {T=new BiTNode;T->data=ch;T->ltag=0;T->rtag=0;CreateTree(T->lchild);CreateTree(T->rchild);}
}
-----------------------线索化start--------
BiTree pre;//全局变量
void Thread(BiTree p) //建立线索
{//根不空if(p){//线索左孩子Thread(p->lchild);//先左孩子空时 线索,再前驱的右孩子空时 线索。if(!p->lchild){p->ltag=1;p->lchild=pre;}if(!pre->rchild){pre->rtag=1;pre->rchild=p;    }pre=p;//前驱后移//线索右孩子Thread(p->rchild);}
}
//空头与根连接
void InOrderThread(BiTree &Th,BiTree t)
{//给空头分配空间并初始化Th=new BiTNode;Th->ltag=0;Th->rtag=1;//右孩子是自身Th->rchild=Th;//左孩子,根空是自身,否则就是根if(!t)Th->lchild=Th;else{Th->lchild=t;//初始化前驱pre=Th;//将树线索化Thread(t);//完成终点连接,线索最终前驱与空头pre->rchild=Th;pre->rtag=1;Th->rchild=pre;}
}
------------------------线索化end---------//中序遍历输出
void InOrderTraver_Th(BiTree T)
{//空头的左孩子=根BiTree p=T->lchild;//根不为空。若为空,则空头左孩子是自身Thwhile(p!=T){//左标记不是线索就后移while(p->ltag==0)p=p->lchild;//找到尾并输出cout<<p->data;while(p->rtag==1&&p->rchild!=T)//往上层回溯且未到根{p=p->rchild;//继续回溯并输出cout<<p->data;}p=p->rchild;//遍历右子树}
}
int main()
{BiTree TH,T;CreateTree(T);InOrderThread(TH,T);InOrderTraver_Th(TH);return 0;
}

未完。☟ 2020.12.03

层次遍历

#include <bits/stdc++.h>
using namespace std;
typedef struct BiNode
{char data;struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreatTree(BiTree &T)
{char ch;cin>>ch;if(ch=='@')T=NULL;else{T=new BiTNode;T->data=ch;CreatTree(T->lchild);CreatTree(T->rchild);}
}
//队列部分
typedef struct QNode
{BiTree data;//树的指针为节点struct QNode *next;
}QNode,*LinkQNode;typedef struct
{LinkQNode front;LinkQNode rear;
}Queue;void InitQueue(Queue &Q) //初始化队列
{Q.front=Q.rear=new QNode;if(Q.front)Q.front->next=NULL;
}
void InQueue(Queue &Q,BiTree t)//入队
{LinkQNode p=new QNode;if(p){p->data=t;p->next=NULL;Q.rear->next=p;Q.rear=p;}
}
int OutQueue(Queue &Q,LinkQNode &p)//出队,队空-返回值为0;
{if(Q.front!=Q.rear){p=Q.front->next;Q.front->next=p->next;if(Q.rear==p)//只有一个元素pQ.rear=Q.front;return 1;}else return 0;
}
void SeqTraverse(Queue &Q)
{LinkQNode p;while(OutQueue(Q,p))//不为空{cout <<p->data->data;//p->data是树,树->dataif(p->data->lchild)InQueue(Q,p->data->lchild);if(p->data->rchild)InQueue(Q,p->data->rchild);}cout<<endl;
}
int main() {//  std::cout << "hello, world" << std::endl;//初始化 树 队列BiTree T;Queue Q;CreatTree(T);InitQueue(Q);//把树入队,再层次遍历InQueue(Q,T);SeqTraverse(Q);return 0;
}

哈夫曼树

构造与带权路径长度 传送门

数据结构--二叉树与森林记事本相关推荐

  1. 数据结构-树,二叉树,森林

    树,二叉树,森林 王卓老师的数据结构课程笔记 树和二叉树 定义 结点之间有分支,具有层次关系 是n个结点的有限集. 若n = 0,称为空树: 若n > 0,则它满足如下两个条件: 有且仅有一个特 ...

  2. 数据结构——树、森林和二叉树之间的转换

    摘自大佬博客http://www.cnblogs.com/zhuyf87/archive/2012/11/04/2753950.html 树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. ( ...

  3. 数据结构-----二叉树,树,森林之间的转换

    图片和转换步骤来自这里 本文主要描述具体实现 用一种略微老土的话描述: 二叉树:每一节点最多有2个子节点,左边的叫左节点,右边的叫右节点,自己叫根节点. 树:每个节点的子节点数量不受限制. 森林:由若 ...

  4. [数据结构]树、森林与二叉树之间的相互转换方法

    树.二叉树与森林的相互转换 本文只给出树.森林与二叉树之间的转换方法,而详细的证明过程不在本文讨论范围之内. 树 → 二叉树 在所有兄弟结点之间加一连线. 对每个结点,除了保留与其长子的连线外,去掉该 ...

  5. 数据结构——简单实现森林转化为二叉树

    孩子兄弟表示法的理解与代码实现|树转化为二叉树 森林是由若干棵树组成,可以将森林中的每棵树的根结点看作是兄弟,由于每棵树都可以转换为二叉树,所以森林也可以转换为二叉树. 将森林转换为二叉树的步骤是: ...

  6. 数据结构——树、森林、二叉树的转换

    树.森林与二叉树的转换 树转换二叉树 规则:左孩子右兄弟,每个结点左指针指向它的第一个孩子结点,右指针指向它在树中相邻兄弟结点. 二叉树转换为树 规则: 逆过程,将指针修改回来,指向其双亲结点. 森林 ...

  7. Mr.J--树、二叉树、森林的转换

    树 树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合.把它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特 ...

  8. 数据结构-二叉树入门Go语言实现

    数据结构-二叉树入门Go语言实现 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构--"树",考虑它的各种特性,来 ...

  9. 8.遍历二叉树、线索二叉树、森林

    思考 一.什么遍历二叉树.线索二叉树.森林?(What) 0.二叉树遍历一共(4种) 1.二叉树先序遍历 2.二叉树中序遍历 3.二叉树后序遍历 4.遍历分析 5.遍历二叉树 6.二叉树层次遍历 7. ...

最新文章

  1. JSP实现大学生综合素质测评系统
  2. 【Linux 内核】进程管理 - 进程优先级 ② ( prio 调度优先级 | static_prio 静态优先级 | normal_prio 正常优先级 | rt_priority 实时优先级 )
  3. 阿里算法工程师公开机器学习路线,你的路走对了吗?
  4. 关于VS环境下制作和使用静态库和动态库
  5. C#中使用指针转换数据类型[C#/unsafe]
  6. Akash Network主网现已部署Sushiswap应用
  7. 家庭网络,怎么给每个房间装一个无线路由器?
  8. 不加密,DES加密 RSA加密图
  9. SharePoint 2010 自定义Ribbon实现文档批量下载为Zip文件
  10. [蓝桥杯]试题 基础练习 完美的代价
  11. HDU 6186 2017广西邀请赛:CS Course
  12. 论文笔记_S2D.49_2017-CVPR_从视频中无监督学习深度和运动估计(SFMLearner)
  13. github开源项目大集合
  14. MODIS数据快速下载方法
  15. 聪明女婿VS刁蛮丈母娘之三十六计【转载】
  16. wow私服,arcemu trunk源码编译架设
  17. linux命令行使用for循环,linux命令:for循环
  18. 物联网-通信模块使用笔记
  19. 竞赛练一练 第15期:电子学会2021年9月青少年软件编程(图形化)等级考试试卷(三级)...
  20. msec是毫秒; usec是微秒

热门文章

  1. 《C关键字分析》之extern用法
  2. iOS获取音频设备信息
  3. iOS 使用mp4v2合成的视频注意事项
  4. tensorflow之安装PIL
  5. 如何在Linux中安装Intel核显驱动?
  6. move_uploaded_file返回false但实际成功_023 Spring Boot 搭建实际项目开发框架
  7. python训练过程是什么_学了这么久,你知道Python机器学习全流程是怎样的么?
  8. 微信小程序 地图功能的实现 map
  9. cesium 模型绕点飞行一周
  10. python读取csv时keyerror_python – 错误:pandas hashtable keyerror