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

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

#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;
} 
上一篇:AWS EKS生产遇到的错误整理(持续更新)


下一篇:第十课:人人站模板开发(nodes标签获取栏目列表)