链式二叉树的构造、遍历及测量高度(C/C++实现)

代码实现:

#include<stdio.h>
#include<stdlib.h>

#define ElemType int
typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

void Locate(BiTNode* &t,BiTNode* &k)  //根据实际定义的规则将新加入的节点安放在二叉树中的位置 
{  //我自定义的规则是:小于等于父结点的数就做左孩子,否则就做右孩子 
	while(1)
	{
		if(t->data>=k->data)
		{
			if(t->lchild)t=t->lchild;
			else{
				t->lchild=k;
				return; 
		    }
		}
	    if(t->data<k->data)
		{
			if(t->rchild)t=t->rchild;
			else{
				t->rchild=k;
				return; 
		    }
		}	
	}
}

void BuildTree(BiTree &T) //用用户输入的序列构造二叉树
{
	int a;
	T=NULL;
	T=(BiTree)malloc(sizeof(BiTNode));
	T->data=-999;
	BiTNode *t=T;
	T->lchild=NULL;
	T->rchild=NULL;
	scanf("%d",&a);
	while(a!=9999)
	{
		if(T->data==-999)T->data=a;
		else{
			BiTNode* k=(BiTNode*)malloc(sizeof(BiTNode));
			k->data=a;
			k->lchild=NULL;
			k->rchild=NULL;
			Locate(t,k);   //根据实际定义的规则将新加入的节点安放在二叉树中的位置 
		}
		t=T;
		scanf("%d",&a);
	}
}

void Visit(BiTNode* T)
{
	printf("%d ",T->data);
}

void PreOrder(BiTree T)
{
	if(T)
	{
		Visit(T);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
	return;
}

void InOrder(BiTree T)
{
	if(T)
	{
		InOrder(T->lchild);
		Visit(T);		
		InOrder(T->rchild);
	}
	return;
}

void PostOrder(BiTree T)
{
	if(T)
	{
		PostOrder(T->lchild);		
		PostOrder(T->rchild);
		Visit(T);		
	}
	return;
}

typedef struct Node{
	BiTNode* data;
	struct Node* next;
}Node;   //定义队列结点 

typedef struct LinkQueue{
	Node *head,*rail;
}LinkQueue;   //定义队列结点   

void EnQueue(LinkQueue &L,BiTNode* t)  //链队列入队 
{
	Node *p=(Node*)malloc(sizeof(Node));
	p->data=t;
	p->next=NULL;
	if(L.head==NULL&&L.rail==NULL)
	{
		L.rail=p;
		L.head=L.rail;
	}
	else
	{
	   L.rail->next=p;
	   L.rail=p;
    }
}

bool DeQueue(LinkQueue &L,BiTNode* &t) //链队列出队 
{
	if(L.head==NULL&&L.rail==NULL)return false;
	Node *p=L.head;
	t=p->data;
	if(p==L.rail)
	{
		L.head=NULL;
		L.rail=NULL;
	}
	else
	{
		L.head=p->next;
	}
	free(p);
	return true;
}

bool QueueEmpty(LinkQueue L)
{
	if(L.head==NULL&&L.rail==NULL)return true;
	else return false;
}

void LevelOrder(BiTree T)
{
	LinkQueue L; //定义用来存储结点指针的队列 
    L.head=L.rail=NULL;
    if(T)Visit(T);
    else printf("\n树为空!!\n");
    if(T->lchild)EnQueue(L,T->lchild);
    if(T->rchild)EnQueue(L,T->rchild);
    while(!QueueEmpty(L))
    {
    	BiTNode* q;
    	DeQueue(L,q);
    	Visit(q);
    	if(q->lchild)EnQueue(L,q->lchild);
        if(q->rchild)EnQueue(L,q->rchild);
	}
	printf("\n");
}

int TreeDepth(BiTree T)  //测量二叉树的高度 
{
	if(T==NULL)return 0;
	else{
		int l=TreeDepth(T->lchild);
		int r=TreeDepth(T->rchild);
		return (l+1)>(r+1)?(l+1):(r+1);
	}
}

void DestroyTree(BiTree &T) //二叉树销毁算法
{
	if(T!=NULL)
	{
		DestroyTree(T->lchild);
		DestroyTree(T->rchild);
		free(T);
	}
	else return;
} 

int main()
{
	BiTree T; //定义一棵空树
	printf("\n请输入构造序列:\n");
	BuildTree(T); //用用户输入的序列构造二叉树 
	
	printf("\n输出先序遍历结果:\n");
	PreOrder(T);  //先序遍历 
	printf("\n\n输出中序遍历结果:\n");
	InOrder(T);   //中序遍历 
	printf("\n\n输出后序遍历结果:\n");
	PostOrder(T);  //后序遍历 
	printf("\n\n输出层序遍历结果:\n");
	LevelOrder(T);   //层序遍历 
	
	printf("\n\n此二叉树高度为: %d\n",TreeDepth(T));
	
	DestroyTree(T);    //二叉树的销毁 
	printf("\n销毁成功!\n");
}

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值