树的操作(二叉树)

 1.二叉树的创建与输出

#include<iostream>
//#include<cstdio>
//#include<cstdlib> 
using namespace std;
struct node 
{
	char data;
	struct node *lchild;
	struct node *rchild;
};
typedef struct node BTnode;
typedef struct node* tree;
tree root;//定义一棵树 
//二叉树的创建 ,输入样例:ABC###D## 
void creat(tree &bt)
{
	
	char ch;
	ch=getchar();
	if(ch!='#')
	{
		bt=new node;  
		bt->data=ch;
		creat(bt->lchild);
		creat(bt->rchild);
	}
	else bt=NULL;
}
//先序输出:ABCD
void DLR(tree bt)
{
	if(bt==NULL) return;
	else
	{
		cout<<bt->data;
		DLR(bt->lchild);
		DLR(bt->rchild);
	}
} 
//中序遍历:CBAD
void LDR(tree bt)
{
	if(bt==NULL) return;
	else
	{
		LDR(bt->lchild);
		cout<<bt->data;
		LDR(bt->rchild);
	}
} 
//后序遍历:CBDA
void LRD(tree bt)
{
	if(bt==NULL) return;
	else
	{
		LRD(bt->lchild);
		LRD(bt->rchild);
		cout<<bt->data;
		
	}
} 


int main()
{
	creat(root);
	DLR(root);
	cout<<endl;
	LDR(root);
	cout<<endl;
	LRD(root);
	
	
	return 0;
}

2.求二叉树结点的个数

//求二叉树root的结点个数
int BTNodeSize(tree bt) 
{
	if(bt==NULL) return 0;
	return BTNodeSize(bt->lchild)+BTNodeSize(bt->rchild)+1;
} 

3.求二叉树叶子结点个数

//求二叉树叶子结点个数
int BTNodeLeaf(tree bt)
{
	if(bt==NULL) return 0;
	if(bt->lchild==NULL&&bt->rchild==NULL) 
	  return 1;
	return BTNodeLeaf(bt->lchild)+BTNodeLeaf(bt->rchild);
} 

 4.求二叉树的深度

//求二叉树的深度
int BTDepth(tree bt)
{
	if(bt==NULL) return 0;
	int left=BTDepth(bt->lchild);
	int right=BTDepth(bt->rchild);
	return (left>right)?(left+1):(right+1);
} 

5. 判断一个结点是否在二叉树中

//判断一个结点是否在二叉树中
tree BTFind(tree bt,char x)
{
	tree ret;
	if(bt==NULL||bt->data==x)
	  return bt;
	ret=bt->lchild;
	if(ret) return ret;
	ret=bt->rchild;
	if(ret) return ret;
	return NULL;
} 

 6.求K层结点的个数

//求K层结点的个数
int BTNodeKlevel(tree bt,int k)
{
	if(bt==NULL) return 0;
	if(k==1) return 1;
	return BTNodeKlevel(bt->lchild,k-1)+BTNodeKlevel(bt->rchild,k-1);
}

7.获取一个结点的左孩子结点

//获取一个结点的左孩子结点
tree GetBTNodeLeftChild(tree bt,char x)
{
	tree ret =NULL;
	if(root==NULL) return NULL;
	ret=BTFind(bt,x);
	if(ret==NULL) return NULL;
	if(ret->lchild) 
	  return ret->lchild;
	else return NULL;  
}

8. 获取一个结点的右孩子结点

//获取一个结点的右孩子结点
tree GetBTNodeRightChild(tree bt,char x)
{
	tree ret =NULL;
	if(bt==NULL) return NULL;
	ret=BTFind(bt,x);
	if(ret==NULL) return NULL;
	if(ret->lchild) 
	  return ret->rchild ;
	else return NULL;  
}

 9.在排序二叉树找一棵树,返回节点

//在排序二叉树找一棵树,返回节点
tree findn(tree bt,char n)
{
	//排序二叉树中节点左侧都小于该结点 
	if(bt==NULL) return NULL;
	if(n<bt->data) findn(bt->lchild,n);
	else if(n>bt->data) findn(bt->rchild,n);
	else return bt;
}

10. 层序遍历

void BTLevelSearch(tree bt)
{
	queue<tree>q;
	if(bt==NULL) return;
	q.push(bt);
	
	while(!q.empty())
	{
		tree f=q.front();
		cout<<f->data;
		q.pop();
		//将他的两个孩子入队
		if(f->lchild)
		{
			q.push(f->lchild);
		} 
		if(f->rchild)
		{
			q.push(f->rchild);
		}
	}
	cout<<endl;
}

11. 判断一棵树是否为完全二叉树

//判断一棵树是否为完全二叉树
bool BTComplete(tree bt)
{
	queue<tree>q;
	if(bt==NULL) return true;
	q.push(bt);
	while(!q.empty())
	{
		tree f=q.front();
		if(f==NULL)
		{
			while(!q.empty())
			{
				if(q.front())
				{
					return false;
				}
				q.pop();
			}
			return true;
		}
		else
		{
			q.push(f->lchild);
			q.push(f->rchild);
		}
		q.pop();
	}
}

12. 二叉树某结点的层数

//二叉树某结点的层数
void getNodeLayer(tree bt,char x,int layer)
{
	if(bt==NULL) return;
	if(bt->data==x)
	{
		cout<<layer<<endl;
		return;
	}
	getNodeLayer(bt->lchild,x,layer+1);
	getNodeLayer(bt->rchild,x,layer+1);
}

 总代码:

#include<iostream>
#include<queue>
//#include<cstdio>
//#include<cstdlib> 
using namespace std;
struct node 
{
	char data;
	struct node *lchild;
	struct node *rchild;
};
typedef struct node BTnode;
typedef struct node* tree;
tree root;//定义一棵树 
//二叉树的创建 ,输入样例:ABC###D## 
void creat(tree &bt)
{
	
	char ch;
	ch=getchar();
	if(ch!='#')
	{
		bt=new node;  
		bt->data=ch;
		creat(bt->lchild);
		creat(bt->rchild);
	}
	else bt=NULL;
}
//先序输出:ABCD
void DLR(tree bt)
{
	if(bt==NULL) return;
	else
	{
		cout<<bt->data;
		DLR(bt->lchild);
		DLR(bt->rchild);
	}
} 
//中序遍历:CBAD
void LDR(tree bt)
{
	if(bt==NULL) return;
	else
	{
		LDR(bt->lchild);
		cout<<bt->data;
		LDR(bt->rchild);
	}
} 
//后序遍历:CBDA
void LRD(tree bt)
{
	if(bt==NULL) return;
	else
	{
		LRD(bt->lchild);
		LRD(bt->rchild);
		cout<<bt->data;
		
	}
} 
//求二叉树root的结点个数
int BTNodeSize(tree bt) 
{
	if(bt==NULL) return 0;
	return BTNodeSize(bt->lchild)+BTNodeSize(bt->rchild)+1;
} 
//求二叉树叶子结点个数
int BTNodeLeaf(tree bt)
{
	if(bt==NULL) return 0;
	if(bt->lchild==NULL&&bt->rchild==NULL) 
	  return 1;
	return BTNodeLeaf(bt->lchild)+BTNodeLeaf(bt->rchild);
} 
//求二叉树的深度
int BTDepth(tree bt)
{
	if(bt==NULL) return 0;
	int left=BTDepth(bt->lchild);
	int right=BTDepth(bt->rchild);
	return (left>right)?(left+1):(right+1);
} 
//判断一个结点是否在二叉树中
tree BTFind(tree bt,char x)
{
	tree ret;
	if(bt==NULL||bt->data==x)
	  return bt;
	ret=bt->lchild;
	if(ret) return ret;
	ret=bt->rchild;
	if(ret) return ret;
	return NULL;
} 
//求K层结点的个数
int BTNodeKlevel(tree bt,int k)
{
	if(bt==NULL) return 0;
	if(k==1) return 1;
	return BTNodeKlevel(bt->lchild,k-1)+BTNodeKlevel(bt->rchild,k-1);
}
//获取一个结点的左孩子结点
tree GetBTNodeLeftChild(tree bt,char x)
{
	tree ret =NULL;
	if(root==NULL) return NULL;
	ret=BTFind(bt,x);
	if(ret==NULL) return NULL;
	if(ret->lchild) 
	  return ret->lchild;
	else return NULL;  
}
//获取一个结点的右孩子结点
tree GetBTNodeRightChild(tree bt,char x)
{
	tree ret =NULL;
	if(bt==NULL) return NULL;
	ret=BTFind(bt,x);
	if(ret==NULL) return NULL;
	if(ret->lchild) 
	  return ret->rchild ;
	else return NULL;  
}
//在排序二叉树找一棵树,返回节点
tree findn(tree bt,char n)
{
	//排序二叉树中节点左侧都小于该结点 
	if(bt==NULL) return NULL;
	if(n<bt->data) findn(bt->lchild,n);
	else if(n>bt->data) findn(bt->rchild,n);
	else return bt;
}
//层序遍历
void BTLevelSearch(tree bt)
{
	queue<tree>q;
	if(bt==NULL) return;
	q.push(bt);
	
	while(!q.empty())
	{
		tree f=q.front();
		cout<<f->data;
		q.pop();
		//将他的两个孩子入队
		if(f->lchild)
		{
			q.push(f->lchild);
		} 
		if(f->rchild)
		{
			q.push(f->rchild);
		}
	}
	cout<<endl;
}
//判断一棵树是否为完全二叉树
bool BTComplete(tree bt)
{
	queue<tree>q;
	if(bt==NULL) return true;
	q.push(bt);
	while(!q.empty())
	{
		tree f=q.front();
		if(f==NULL)
		{
			while(!q.empty())
			{
				if(q.front())
				{
					return false;
				}
				q.pop();
			}
			return true;
		}
		else
		{
			q.push(f->lchild);
			q.push(f->rchild);
		}
		q.pop();
	}
}
//二叉树某结点的层数
void getNodeLayer(tree bt,char x,int layer)
{
	if(bt==NULL) return;
	if(bt->data==x)
	{
		cout<<layer<<endl;
		return;
	}
	getNodeLayer(bt->lchild,x,layer+1);
	getNodeLayer(bt->rchild,x,layer+1);
}
int main()
{
	creat(root);
	DLR(root);
	cout<<endl;
	LDR(root);
	cout<<endl;
	LRD(root);
	cout<<endl;
	//结点个数 
	cout<<BTNodeSize(root)<<endl;
	//叶子结点个数 
	cout<<BTNodeLeaf(root)<<endl;
	//二叉树的深度
	cout<<BTDepth(root)<<endl; 
	// 判断一个结点是否在二叉树中
	cout<<"请输入需要判断的结点元素:";
	char xx;
	cin>>xx;
	tree temp;
	if(temp=BTFind(root,xx))
	{
		cout<<"存在该结点:"<<temp->data;
	}
	else cout<<"不存在";
	cout<<endl; 
	//求K层结点的个数:k=3
	cout<<BTNodeKlevel(root,3)<<endl; 
	//获取某一个结点的左孩子结点 
	if(temp=GetBTNodeLeftChild(root,'A'))
	{
		cout<<temp->data ;
	}
	else cout<<"不存在左孩子结点";
	cout<<endl; 
	//获取某一个结点的右孩子结点 
	if(temp=GetBTNodeRightChild(root,'A'))
	{
		cout<<temp->data ; 
	} 
	else cout<<"不存在右孩子结点"; 
	cout<<endl;
	//排序二叉树找一棵树
	if(temp=findn(root,'A'))
	{
		cout<<"存在"; 
	}
	else cout<<"不存在"; 
	cout<<endl;
	//层序遍历
	BTLevelSearch(root);
	//判断一棵树是否为完全二叉树 
	if(BTComplete(root)) cout<<"是完全二叉树";
	else cout<<"不是完全二叉树";
	cout<<endl;
	//二叉树某结点的层数 
	getNodeLayer(root,'A',1); 
	 
	return 0;
	
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值