ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉树基本操作(层序、先序创建,遍历方式等)

2021-12-06 12:02:14  阅读:151  来源: 互联网

标签:lchild 层序 bitTree nodes 二叉树 基本操作 rchild NULL 节点


关于树的操作,大部分都是使用递归的思想。只有层序构建二叉树时需要注意一下,它通过使用队列的方式记录每一个节点,当一个节点有孩子节点时,就将孩子节点添加到队列中。当队列为空时,则说明二叉树建立完毕。具体操作都在代码中。

#include <iostream>
#include <queue>

using namespace std;
typedef struct node{
	char data;
	node *lchild,*rchild;
	//节点中包含节点的数值和其左右两个节点的地址 
}*bitTree;//注意这里bittree改名的写法 
//注意用结构体里的数据时 用 -> 好过 .  

//先序方式构造 
void create_tree(bitTree &T)
//注意这里传入的是树的地址  
{
	char c;
	cin>>c;
	if(c == '0') T = NULL;
	else
	{
		T = new node;//在构造树时,需要new一个新的节点才可以对他们进行赋值 
		T -> data = c;
		create_tree(T->lchild);
		create_tree(T->rchild);
	}
}
//层序方式形成二叉树 
void layer_create_tree (bitTree &T)
{
	char c;
	cin >> c;
	queue<bitTree> nodes;
	bitTree n;//用来保存每一个节点 
	if(c == '0'){
		T = NULL; 
	}else{
		T = new node;//注意需要new node 
		T->data = c;
		T->lchild = T->rchild = NULL;
		nodes.push(T); //入队 
		
	}
	//通过对队列的输出,对每一个节点的左右孩子节点都做一个定义
	//每次队列都是那一层中的节点 
	while(!nodes.empty())
	{	
		n = nodes.front();
		
		nodes.pop();
		cin>>c;
		if(c == '0'){
			n->lchild = NULL;
		}else{
			n->lchild = new node;
			n->lchild->data = c;
			n->lchild->lchild = n->lchild->rchild = NULL;
			nodes.push(T->lchild);//新加入的节点都要入栈 
		}
		char d; 
		cin>>d;
		if(d == '0'){
			n->rchild = NULL;
		}else{
			n->rchild = new node;
			n->rchild->data = d;
			n->rchild->lchild = n->rchild->lchild = NULL;
			nodes.push(n->rchild);//新加入的节点都要入栈 
		}
	} 
	
}
void preorder(bitTree T)
{//先序遍历 
	if(T!=NULL)
	{
		cout<<T->data<<" ";
		preorder(T->lchild);
		preorder(T->rchild); 
	}
}
void midorder(bitTree T) 
{//中序遍历 
	if(T!=NULL)
	{
		midorder(T->lchild);
		cout<<T->data<<" ";
		midorder(T->rchild); 
	}
}
void rearorder(bitTree T)
{
	if(T!=NULL)
	{
		rearorder(T->lchild);
		rearorder(T->rchild);
		cout<<T->data<<" "; 
	}
}
int count_leaf(bitTree T)//叶子节点数 
{
	if(T == NULL) return 0;
	if(T->lchild==NULL&&T->rchild==NULL)
	{
		return 1;
	}else{
		return count_leaf(T->lchild)+count_leaf(T->rchild);
	} 
	//判断当前节点左右两个字节点为叶子节点的个数后返回 
	//因为不断的递归,最终就是根节点左右两子树中叶子节点的个数 
} 
int count_deep(bitTree T)//深度 
{
	int sum;
	if(T){
		//count_deep(T->lchild);
//		return max(count_deep(T->lchild),count_deep(T->rchild))+1;
		return count_deep(T->lchild)+1;
		//递归中的加法需要在每一层有实质的加数 
	}else{
		return 0;//空树的节点为零 
	}
}
void test()
{
	queue<bitTree> nodes;
	bitTree n,m;
//	create_tree(n);
//	create_tree(m);
	n = new node;
	m = new node;
	n->data = 'a';
	n->lchild = n->rchild = NULL;
	m->data = 'a';
	m->lchild = m->rchild = NULL;
	 
	nodes.push(n);
	nodes.push(m);
	cout<<"ok"<<endl;
	rearorder(nodes.front());//队列可以将树作为类型传入 
}
int main()
{	
//	test();
	bitTree t;
	//create_tree(t);//先序创建 
	layer_create_tree(t);//层序创建 
	cout<<"先序遍历:";
	preorder(t);
	cout<<endl;
	cout<<"中序遍历:" ;
	midorder(t);
	cout<<endl;
	cout<<"后序遍历:";
	rearorder(t);
	cout<<endl;
	cout<<"叶子节点个数:"<<count_leaf(t)<<endl;
	cout<<"深度:"<<count_deep(t)<<endl;
} 

标签:lchild,层序,bitTree,nodes,二叉树,基本操作,rchild,NULL,节点
来源: https://www.cnblogs.com/waydmt/p/15649291.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有