博客
关于我
二叉树的创建遍历应用删除
阅读量:379 次
发布时间:2019-03-04

本文共 3628 字,大约阅读时间需要 12 分钟。

二叉树的创建

typedef struct Bitree {   	char data;	struct Bitree* lchild;//创建左孩子结点	struct Bitree* rchild;//创建右孩子结点}BiNode;//利用拓展二叉树(#虚节点)BiTree *createBiTree(BiNode *bt) {   //前序建立	char c;	cin >> c;	if (c == '#')//空树		bt = NULL;	else	{   		bt = new BiTree;//创建一个结点		bt->data = c;		bt->lchild = createBiTree(bt->lchild);//将递归创建左孩子的结果赋给bt的左孩子		bt->rchild = createBiTree(bt->rchild);/*不可以这样递归建立二叉树(无法建立节点之间的连接关系)        createBiTree(bt->lchild);        createBiTree(bt->rchild);        }   	return;    }*/	}	return bt;//返回树的地址}

主函数:

BiTree* T = NULL;BiTree* root = createBiTree(T);//main函数也是获取root

创建方式二

//利用C++指针的引用(可以建立起节点间的联系)BiTree::BiTree(){       Creat(root);}//只要bt的值发生改变,就会影响实际传入值rootvoid BiTree::Creat(BiNode* &bt) {   //注意bt是指针类型	char c;	cin >> c;	if (c == '#')//空树		bt = NULL;	else	{   		bt = new BiTree;//创建一个结点		bt->data = c;		Creat(bt->lchild);		Creat(bt->rchild);	}	return;}

二叉树的遍历

1.前序遍历

void preOrder(BiTree* bt) {   	if (bt == NULL) {   		return ;	}	else {   		cout << bt->data << " ";		preOrder(bt->lchild);		preOrder(bt->rchild);	}}

2.层序遍历

void LeverOrder(BiTree* root){       if(root == NULL){           return ;    }    queue.enQueue(root);//根节点入队    while(!queue.isEmpty()){           q=queue.deQueue();//出队        cout<
data+" "; if(q->lchild!=NULL){ //左孩子入队 queue.enQueue(q->lchild); } if(q->rchild!=NULL){ //右孩子入队 queue.enQueue(q->rchild); } }}

应用

计算二叉树的深度

二叉树的深度是树中节点的最大层次,是左右子树深度的较大者加1。

int GetTreeDeep(BiTree T){       if(T==NULL){           return 0;    }else{           a = GetTreeDeep(T->lchild);        b = GetTreeDeep(T->rchild);        return (a>b)?(a+1):(b+1);        //return max(a+1,b+1);    }}

复制二叉树

复制二叉树就是利用已有的一棵二叉树复制得到另外一棵与其完全相同的二叉树。根据二又树的特点,复制步骤如下:若二叉树不空,则首先复制根结点,这相当于二又树先序遍历算法中访问根结点的语句;然后分别复制二叉树根结点的左子树和右子树、这相当于先序遍历中递归遍遍历左子树和右子树的语句。

typedef struct BiTNode {   	char data;	struct BiTNode * lchild,*rchild;}BiTNode ,*BiTree;void Copy(BiTree T, BiTree &NewT)//注意BiTree是指针类型{   	if(T==NULL){   //空树,递归结束		NewT=null;		return;	}	else{   		NewT=new BiTNode;		NewT->data=T->data;		Copy(T->lchild, T->lchild);		Copy(T->rchild, T->rchild);	}}

统计二叉树中节点的个数

int NodeCount(BiTree T)//BiTree是指针类型{   	if(T == NULL)		return 0;	else			return NodeCount(T->lchild)+NodeCount(T->rchild)+1;		//否则节点的个数为左子树的节点个数+右子树的节点个数+1}

求叶子节点数量(度为0)

int get_leaf_number(BTreeNode *root){    if(root == NULL)  	return 0; if(root->lchild == NULL && root->rchild == NULL) 	 return 1; return (get_leaf_number(root->lchild) + get_leaf_number(root->rchild));}

求度为1节点数量

两种写法,一种是最后return。

int NodeCount(BiTree T){      if(T==NULL) {          return 0;   }   //找到度为1的节点:只有右孩子 或 只有左孩子   if(T->lchild==NULL&&T->rchild!=NULL || T->rchild==NULL&&T->lchild!=NULL){     	   return 1+NodeCount(T->lchild)+NodeCount(T->rchild);//返回1(节点自己)+递归左孩子 或 右孩子   }   else{   //该节点的度为2,继续向下递归       return NodeCount(T->lchild)+NodeCount(T->rchild);   }}
int NodeNumber(BiTree T){   	int sum=0;	if(T==NULL){   		return 0;	}	if(T!=NULL){   		if( (T->lchild==NULL&&T->rchild!=NULL) ||(T->lchild!=NULL&&T->rchild==NULL)){   			sum=1+NodeNumber(T->lchild)+NodeNumber(T->rchild);		}		else{   			sum=NodeNumber(T->lchild)+NodeNumber(T->rchild);		} 	}	return sum;}

求度为2节点数量

int NodeNumber(BiTree T){   	int sum=0;	if(T==NULL){   		return 0;	}	if(T!=NULL){   		if((T->lchild!=NULL)&&(T->rchild!=NULL)){   //左右孩子都有就可以			sum=1+NodeNumber(T->lchild)+NodeNumber(T->rchild);		}		else{   			sum=NodeNumber(T->lchild)+NodeNumber(T->rchild);		} 	}	return sum;}

删除二叉树

void Release(BiTree T){       if(T!=NULL){           Release(T->lchild);        Release(T->rchild);        delete(T);    }}

待续:线索二叉树与哈夫曼编码…

转载地址:http://ttyg.baihongyu.com/

你可能感兴趣的文章
Nacos服务部署安装
查看>>
nacos本地可以,上服务器报错
查看>>
Nacos注册Dubbo(2.7.x)以及namespace配置
查看>>
Nacos注册中心有几种调用方式?
查看>>
nacos注册失败,Feign调用失败,feign无法注入成我们的bean对象
查看>>
nacos源码 nacos注册中心1.4.x 源码 nacos源码如何下载 nacos 客户端源码下载地址 nacos discovery下载地址(一)
查看>>
nacos源码 nacos注册中心1.4.x 源码 spring cloud alibaba 的discovery做了什么 nacos客户端是如何启动的(二)
查看>>
nacos源码 nacos注册中心1.4.x 源码 如何注册服务 发送请求,nacos clinet客户端心跳 nacos 注册中心客户端如何发送的心跳 (三)
查看>>
Nacos源码分析:心跳机制、健康检查、服务发现、AP集群
查看>>
nacos看这一篇文章就够了
查看>>
Nacos简介、下载与配置持久化到Mysql
查看>>
Nacos简介和控制台服务安装
查看>>
Nacos管理界面详细介绍
查看>>
Nacos编译报错NacosException: endpoint is blank
查看>>
nacos自动刷新配置
查看>>
nacos运行报错问题之一
查看>>
Nacos部署中的一些常见问题汇总
查看>>
NACOS部署,微服务框架之NACOS-单机、集群方式部署
查看>>
Nacos配置Mysql数据库
查看>>
Nacos配置中心中配置文件的创建、微服务读取nacos配置中心
查看>>