0
点赞
收藏
分享

微信扫一扫

数据结构——建立二叉树(前序遍历,中序遍历,后序遍历)

Spinach菠菜 2022-02-03 阅读 125

二叉树类型

相关术语

①结点:包含一个数据元素及若干指向子树分支的信息  。
②结点的度:一个结点拥有子树的数目称为结点的度  。
③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点  。
④分支结点:也称为非终端结点,度不为零的结点称为非终端结点   。
⑤树的度:树中所有结点的度的最大值。
⑥结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层  。
⑦树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度   。
⑧有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树  。
⑨无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树 。
⑩森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根结点删除,则该树就变成了一片森林,森林中的树由原来根结点的各棵子树构成  。

二叉树性质

性质1:二叉树的第i层上至多有2i-1(i≥1)个节点 。
性质2:深度为h的二叉树中至多含有2h-1个节点 。
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1  。
性质4:具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)。
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点: 
当i=1时,该节点为根,它无双亲节点   。
当i>1时,该节点的双亲节点的编号为i/2   。
若2i≤n,则有编号为2i的左节点,否则没有左节点 。
若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点   。

1.二叉树表的创建

//二叉树的建立
void CreatTree(tree *T)
{
	char ch;
	cin>>ch;
	if(ch=='#')	
		*T=NULL;
	else
	{
		*T=new Csnode;
		if(!T)
			return;
		(*T)->data=ch;
		printf("请输入%c的左子树: ",ch);
		CreatTree(&(*T)->lchild);
		printf("请输入%c的右子树: ",ch);
		 CreatTree(&(*T)->rchild);
	}
 } 

2.前中后序遍历

//前序遍历算法
 void PreCreat(tree T)  
 {
 	if(T==NULL)
 		return ;
 	cout<<T->data<<" ";
 	PreCreat(T->lchild);
 	PreCreat(T->rchild);
 }
 //中序遍历算法
 void MidCreat(tree T)  
 {
 	if(T==NULL)
 		return ;
 	MidCreat(T->lchild);
 	cout<<T->data<<" ";
 	MidCreat(T->rchild);
 }
 //后序遍历算法
 void RearCreat(tree T)  
 {
 	if(T==NULL)
 		return ;
 	RearCreat(T->lchild);
 	RearCreat(T->rchild);
 	cout<<T->data<<" ";
 }

3.测试案例

#include<iostream>
using namespace std;

//二叉树的结构定义
 typedef struct csNode
 {
 	char data;
 	struct csNode*lchild;
 	struct csNode*rchild;
  } Csnode,*tree;
//二叉树的建立
void CreatTree(tree *T)
{
	char ch;
	cin>>ch;
	if(ch=='#')	
		*T=NULL;
	else
	{
		*T=new Csnode;
		if(!T)
			return;
		(*T)->data=ch;
		printf("请输入%c的左子树: ",ch);
		CreatTree(&(*T)->lchild);
		printf("请输入%c的右子树: ",ch);
		 CreatTree(&(*T)->rchild);
	}
 } 
 //前序遍历算法
 void PreCreat(tree T)  
 {
 	if(T==NULL)
 		return ;
 	cout<<T->data<<" ";
 	PreCreat(T->lchild);
 	PreCreat(T->rchild);
 }
 //中序遍历算法
 void MidCreat(tree T)  
 {
 	if(T==NULL)
 		return ;
 	MidCreat(T->lchild);
 	cout<<T->data<<" ";
 	MidCreat(T->rchild);
 }
 //后序遍历算法
 void RearCreat(tree T)  
 {
 	if(T==NULL)
 		return ;
 	RearCreat(T->lchild);
 	RearCreat(T->rchild);
 	cout<<T->data<<" ";
 }
int main()
{
	printf("请输入第一个节点的数据:\n");
	tree T;
	CreatTree(&T);
	cout<<"前序遍历:"; 
	PreCreat(T); 
	cout<<"\n中序遍历:";
	MidCreat(T) ;
	cout<<"\n后序遍历:";
	RearCreat(T) ;
 } 

测试结果
在这里插入图片描述

举报

相关推荐

0 条评论