数据结构实验报告(二)——二叉树基本操作

目录

  1.  结构体定义
  2. 先序创建二叉树
  3. 遍历
  4. 交换左右子树 
  5. 打印树 
  6. 查找结点
  7. 插入结点(叶子)
  8. 销毁树
  9. 树的深度
  10. 树的宽度
  11. 统计结点个数
  12. 每个叶子结点到根结点的路径

结构体定义

//定义二叉树的结构 
typedef char ElemType;
typedef struct BiTNode
{
    ElemType data;		//数据域 
    struct BiTNode* lchild, * rchild;	//左右子树 
} BiTNode, *BiTree;	//节点、整颗树 

先序创建二叉树

//先序创建二叉树
void CreateBiTree(BiTree *T){
	char ch;
	cin>>ch;
	if(ch=='#') *T=NULL;
	else{
		*T=new BiTNode;
		(*T)->data=ch;
		CreateBiTree(&((*T)->lchild));
		CreateBiTree(&((*T)->rchild));
	}
}

遍历

//先序遍历
void PreOrderTraverse(BiTree T){
	if(T){
		cout<data;
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}
//中序遍历
void InOrderTraverse(BiTree T){
	if(T){
		PreOrderTraverse(T->lchild);
		cout<data;
		PreOrderTraverse(T->rchild);
	}
}
//后序遍历
void PostOrderTraverse(BiTree T){
	if(T){
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
		cout<data;
	}
}

打印树

//打印树 
void PrintTree(BiTree T,int deep,string code){
	//* @T 树的根节点
    //* @deep 此节点的深度
    //* @code 从根节点遍历到此处的路径码,向左用0表示,向右用1表示*/
	if(T){
		PrintTree(T->rchild,deep+1,code+"1");
		for(int i=0;idata<<")"<lchild,deep+1,code+"0"); 	
	}
}

查找节点

//查找节点
BiTree FindNode(BiTree T,ElemType x){
	BiTree tmp;
	if(T==NULL) return NULL;
	if(T->data==x) return T;
	else{
		tmp=FindNode(T->lchild,x);
		if(tmp) return tmp;
		tmp=FindNode(T->rchild,x);
		if(tmp) return tmp;
	}
} 

插入节点(叶子)

//插入节点
void AddNode(BiTree *T,int direction,ElemType x){
	if(direction==0){
		if((*T)->lchild==NULL){
			BiTNode *newNode=new BiTNode;
			newNode->data=x;
			newNode->lchild=NULL,newNode->rchild=NULL;
			(*T)->lchild=newNode;
		}else{
			AddNode(&((*T)->lchild),direction,x);
		}
	}else if(direction==1){
		if((*T)->rchild==NULL){
			BiTNode *newNode=new BiTNode;
			newNode->data=x;
			newNode->lchild=NULL,newNode->rchild=NULL;
			(*T)->rchild=newNode;
		}else{
			AddNode(&((*T)->rchild),direction,x);
		}
	}
}

树的深度

//树的深度
int Depth(BiTree T){
	if(T==NULL) return 0;
	else{
		int i=Depth(T->lchild);
		int j=Depth(T->rchild);
		return i>j ? i+1 : j+1;
	}
}

树的宽度

//求每一层的宽度
void LawyerWidth(BiTree T,int a[],int h){
	if(T){
		a[h]++;
		LawyerWidth(T->lchild,a,h+1);
		LawyerWidth(T->rchild,a,h+1);
	}
}
//树的宽度
int Width(BiTree T){
	int H=Depth(T);		   //总高度 
	int *a=new int[H+1];
	for(int i=0;iwidth) width=a[i];
	}
	return width;
}

统计节点个数

//统计结点个数
int NodeCount(BiTree T){
	if(T==NULL) return 0;
	else{
		return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
	}
} 

每个叶子节点到根节点的路径

//每个叶子节点到根结点的路径
void PrintAllPath(BiTree T,char path[],int pathlen){
	int i;
	if(T){
		path[pathlen] = T->data;
		if(T->lchild==NULL && T->rchild==NULL){
			for(i=pathlen;i>=0;i--){	//倒叙输出 
				cout<lchild,path,pathlen+1);
			PrintAllPath(T->rchild,path,pathlen+1);
		}
	}
}

main函数

int main(){
	BiTree Tree=NULL;
	
	CreateBiTree(&Tree);	//初始化
	cout<<"------初始化------"<

运行结果

数据结构实验报告(二)——二叉树基本操作_第1张图片

你可能感兴趣的:(数据结构,数据结构,算法)