数据结构 实验 二叉树的存储与遍历

数据结构

实验 二叉树的存储与遍历

一、实验目的

1、熟练掌握二叉树的存储结构。

2、熟练掌握二叉树的遍历及基本操作的实现方法。

二、实验原理

1、二叉树的存储结构及其应用。

三、实验设备

Win系统电脑一台

四、实验过程(程序清单)

#define DATAYPE2 char
#include<stdio.h>
#include<malloc.h>
//定义二叉树结构
typedef struct BiTNode{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; 

int count=0;//全局计算机

//1.先序创建一颗二叉树 
void CreateBiTree(BiTree *T){
	BiTree t;
	char ch;
	scanf("%c",&ch);
	if(ch==' '){
		t=NULL;
	}else{
		t=(BiTree)malloc(sizeof(BiTNode)); 
		t->data=ch;
		CreateBiTree(&t->lchild);
		CreateBiTree(&t->rchild); 
	}
	*T=t;
} 
//2.递归先序遍历输出 
void PreOrderTraverse(BiTree T){
	if(T!=NULL){
		printf("%3c",T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
		
	}
}
//3. 中序遍历 
void InOrderTraverse(BiTree T){
	if(T!=NULL){
	InOrderTraverse(T->lchild);
	printf("%3c",T->data);
	InOrderTraverse(T->rchild);	
	}
} 
//4.后序遍历 
void PostOrderTraverse(BiTree T){
	if(T){
	PostOrderTraverse(T->lchild);
	PostOrderTraverse(T->rchild);
	printf("%3c",T->data);	
	}
}
//5.层次遍历 
void LevelorderTraverse(BiTNode *T){
	BiTNode *Queue[50],*p=T;
	int front=0,rear=0;
	if(p!=NULL){
		Queue[rear++]=p;
	}
//	printf("层次遍历:");//根结点入队 
	while(front<rear){
		p=Queue[front++];
		printf("%3c",p->data);
		if(p->lchild!=NULL){
			Queue[rear++]=p->lchild; //左结点入队 
		}
		if(p->rchild!=NULL){
			Queue[rear++]=p->rchild; //右结点入队 
		}
	} 
}
//6.求叶子节点数
void leafnum(BiTNode *T){
	if(T){
		if((T->lchild==NULL)&&(T->rchild==NULL)){
			count++;	
		}
		leafnum(T->lchild);
		leafnum(T->rchild);
	}
} 
//7.求总结点数
void Nodenum(BiTNode *T){
	if(T){
		count++;
		Nodenum(T->lchild);
		Nodenum(T->rchild);
	}
} 
//8.树的深度 
int treehigh(BiTNode *bt){//求二叉树的深度 
	int lh, rh,h;
	if(bt==NULL){
		h=0;
	}
	else{
		lh=treehigh(bt->lchild);
		rh=treehigh(bt->rchild);
		h=(lh>rh?lh:rh)+1;
	}
	return h;
}
//9.判定两棵树是否相等 
int CmpTree(BiTree T1,BiTree T2){
	int left,right;
	if(T1==NULL&&T2==NULL)//两棵树都为NULL,相等 
	    return 1;
	else if(T1==NULL||T2==NULL)//两棵树只有一棵树为NULL,不等 
	    return 0;
	if(T1->data!=T2->data)
		return 0;
	left=right=0;
	left=CmpTree(T1->lchild,T2->lchild);
	right=CmpTree(T1->rchild,T2->rchild);
	return left&&right;
}
int main(){
    BiTree T,T2;  
    char ch1;
    int ch2;
    ch1='y';
    while(ch1=='y'||ch1=='Y'){
        printf("\n\n\n\n");
        printf("\n\t\t***********二叉树非递归**********************");
        printf("\n\t\t*          1.建立二叉树                     *");
        printf("\n\t\t*          2.先序遍历二叉树                 *");
        printf("\n\t\t*          3.中序遍历二叉树                 *");
        printf("\n\t\t*          4.后序遍历二叉树                 *");
        printf("\n\t\t*          5.层次遍历二叉树                 *");
        printf("\n\t\t*          6.叶子节点数                     *");
        printf("\n\t\t*          7.总结点数                       *");
        printf("\n\t\t*          8.树的深度                       *");
        printf("\n\t\t*          9.判定两棵树是否相等             *");
        printf("\n\t\t*          0.exit                           *");
        printf("\n\t\t*********************************************");
        printf("\n\t\t Please select(0-9)");
        scanf("%d",&ch2);
        getchar();
        switch(ch2){
            case 1:
                printf("\n\t\t 输入数据: ");
                CreateBiTree(&T);
				break;
            case 2:
                printf("\n\t先序遍历序列:");
                PreOrderTraverse(T);
                break;
            case 3:
                printf("\n\t中序遍历序列:");
                InOrderTraverse(T);
                break;
            case 4:
                printf("\n\t后序遍历序列:");
                PostOrderTraverse(T);
				break;
            case 5:
                printf("\n\t层次遍历序列:");
                LevelorderTraverse(T);
				break;
            case 6:
                leafnum(T);
                printf("\n\t叶子节点数: %d",count);
                count=0;break;
            case 7:Nodenum(T);
				printf("\n\t结点数: %d",count) ;
				count=0;break;
			case 8:
				printf("\n\t树的深度为: %d",treehigh(T));
				break;
			case 9:
			    int cmp;
				printf("\n\t请输入第二个参与比较的树:");
				CreateBiTree(&T2);
				cmp=CmpTree(T,T2);
				if(cmp==0){
					printf("\n\t两棵树不相等"); 
				}
				else{
					printf("\n\t两棵树相等"); 
				}
				break; 
            case 0:
                ch1='n';break;
            default:
                printf("\n\t\t****ERROR****");
        }
    }
}

五、实验结果

六、实验心得

1、掌握了二叉树先序遍历、中序遍历、后序遍历和层次遍历。

2、学会求树的叶子节点数、结点数和树的深度。

3、掌握了如何判定两棵树是否相等。

4、理解了测试数据与其树的转换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树的层序遍是一种按照从上到下、从左到右的顺序访问二叉树节点的方法。通过层序遍,我们可以逐层遍叉树的节点,并在遍过程中进行判断,从而确定二叉树是否为完全二叉树。层序遍是一种广度优先搜索的遍方式,适用于树结构。通过利用队列实现层序遍,我们可以按照从上到下、从左到右的顺序逐层遍树中的节点。具体实现方法如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def levelOrder(root: TreeNode) -> List[List[int]]: if not root: return [] res = [] queue = [root] while queue: level = [] for i in range(len(queue)): node = queue.pop(0) level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level) return res ``` 以上代码中,我们定义了一个`TreeNode`类来表示二叉树的节点,`levelOrder`函数用于实现二叉树的层序遍。在函数中,我们首先判断根节点是否为空,如果为空则直接返回空列表。然后定义一个`res`列表来存储结果,定义一个`queue`队列来存储待遍的节点。接下来,我们使用一个`while`循环来遍整个二叉树。在每一层遍中,我们定义一个`level`列表来存储当前层的节点值,然后使用一个`for`循环来遍当前层的所有节点。在循环中,我们首先弹出队列中的第一个节点,并将其值加入到`level`列表中。然后判断该节点是否有左右子节点,如果有则将其左右子节点加入到队列中。最后将`level`列表加入到`res`列表中,表示当前层的遍已经完成。最终返回`res`列表即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值