`

二叉树

阅读更多
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100

typedef char ElemType;
typedef struct Node{
	ElemType data;
	struct Node *lchild;
	struct Node *rchild;
} BTree;

/**
*由括号表示法创建链式二叉树
*例如:A(B(D(,G)),C(E,F))
*      创建结点A,A为根结点;A压栈,k=1;创建B,B为A的左孩子;B压栈,k=1;
*      创建D,D为B的左孩子;D压栈,k=1;k=2;G为D的右孩子;D出栈;B出栈;k=2;
* C为A的右孩子;C压栈,k=1;创建E,E为C的左孩子;k=2;F为C的右孩子;C出栈;A出栈
*/
void CreateBTree(BTree *&b,char *str){
	BTree *st[MaxSize]; int top=-1;  //st作为栈,其元素为BTree *,st存储树节点
	int k;                           //k标记是左孩子还是右孩子  
	int i=0; char ch=str[i];          //ch为遍历元素str所处的元素,i为对应位置
	b=NULL;	
	BTree *p=NULL;
	while (ch!='\0'){
   	   	switch(ch) {
	      	case '(':top++;st[top]=p;k=1; break;//接下来创建左孩子,父亲压栈
		    case ')':top--;break;               //右孩子创建完毕,父亲出栈
	    	case ',':k=2; break;                //左孩子创建完毕,接下来创建右孩子
		    default:
				p=(BTree *)malloc(sizeof(BTree));
		     	p->data=ch;p->lchild=p->rchild=NULL;
		         	if (b==NULL)                 //还没有创建根结点
						b=p;
					else
						k==1?st[top]->lchild=p:st[top]->rchild=p;
		}
		ch=str[++i];
	}
}

/**
*查找结点,返回指向该节点的指针
*/
BTree *Find(BTree *b,ElemType x){
	BTree *p;
	if (b==NULL)
	     return NULL;
    if (b->data==x)
	     return b;
	p=Find(b->lchild,x);
		if (p==NULL) 
			return Find(b->rchild,x);
		return NULL;
}

/**
*求二叉树的深度
*/
int BTreeDepth(BTree *b){
   	int l,r;
   	if (b==NULL) 
		return 0; 	
    return 1+((l=BTreeDepth(b->lchild))>(r=BTreeDepth(b->rchild))?l:r);
}

/**
*用括号表示法输出二叉树
*/
void Display(BTree *b){
	if (b!=NULL){
		printf("%c",b->data);
		if (b->lchild!=NULL || b->rchild!=NULL){
			printf("(");
			Display(b->lchild);
			if (b->rchild!=NULL) 
				printf(",");
			Display(b->rchild);
			printf(")");
		}
	}
}

/**
*先序遍历二叉树
*/
void Order(BTree *b){
	if(b!=NULL){
		printf("%c ",b->data);    //若中序遍历,此句放在倒数第二行;若后序,放最后一行
		Order(b->lchild);
		Order(b->rchild);
	}
}

/**先序遍历二叉树(非递归)
*这里用一个栈来存储父节点
*例如:A(B(D(,G)),C(E,F)),操作过程依次是:
*      A进栈(循环之前),top=0;A出栈,C、B入栈,top=1;B出栈,D入栈,top=1;
*      D出栈,G入栈,top=1;G出栈,top=0;C出栈,F、E入栈,top=1;
*      E出栈,top=0;F出栈,top=-1;
*/
void Order1(BTree *b){
	BTree *st[MaxSize]; int top=-1; 
	BTree *p=NULL;
	if(b!=NULL){
		top++;st[top]=b;
	}
	while(top!=-1){
		p=st[top];top--;
		if(p->rchild!=NULL){
			st[++top]=p->rchild;
		}
		if(p->lchild!=NULL){
			st[++top]=p->lchild;
		}
		printf("%c ",p->data);
	}
}

void InOrder(BTree *b)
{
	BTree *St[MaxSize],*p;
	int top=-1;
	if (b!=NULL)
	{
		p=b;
		while (top>-1 || p!=NULL)
		{
			while (p!=NULL)
			{
				top++;
				St[top]=p;
				p=p->lchild;
			}
			if (top>-1)
			{
				p=St[top];
				top--;
				printf("%c ",p->data);
				p=p->rchild;
			}
		}
		printf("\n");
	}
}

void PostOrder(BTree *b)
{
	BTree *St[MaxSize];
	BTree *p;
	int flag,top=-1;						//栈指针置初值
	if (b!=NULL)
	{
		do
		{
			while (b!=NULL)					//将t的所有左结点入栈
			{
				top++;
				St[top]=b;
				b=b->lchild;
			}
			p=NULL;							//p指向当前结点的前一个已访问的结点
			flag=1;	
			while (top!=-1 && flag)
			{
				b=St[top];					//取出当前的栈顶元素
				if (b->rchild==p)			//右子树不存在或已被访问,访问之
				{
					printf("%c ",b->data);	//访问*b结点
					top--;
					p=b;					//p指向则被访问的结点
				}
				else
				{
					b=b->rchild;			//t指向右子树
					flag=0;	
				}
			}
		} while (top!=-1);
		printf("\n");
	} 
}

void TravLevel(BTree *b)
{
	BTree *Qu[MaxSize];				//定义循环队列
	int front,rear;						//定义队首和队尾指针
	front=rear=0;						//置队列为空队列
    if (b!=NULL) 
		printf("%c ",b->data);
    rear++;								//结点指针进入队列
	Qu[rear]=b;
    while (rear!=front)					//队列不为空
    {
		front=(front+1)%MaxSize;
		b=Qu[front];					//队头出队列
		if (b->lchild!=NULL)			//输出左孩子,并入队列
		{
			printf("%c ",b->lchild->data);
			rear=(rear+1)%MaxSize;
			Qu[rear]=b->lchild;
		}
		if (b->rchild!=NULL)			//输出右孩子,并入队列
		{
			printf("%c ",b->rchild->data);
			rear=(rear+1)%MaxSize;
			Qu[rear]=b->rchild;
		}
	} 
	printf("\n");
}

void main()
{
	BTree *b;
	CreateBTree(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); 
	printf("       二叉树:");Display(b);
	printf("\n\n");
	printf(" 层次遍历序列:");
	TravLevel(b);printf("\n");
	printf(" 先序遍历序列:\n");
	printf("     递归算法:");Order(b);printf("\n");
	printf("   非递归算法:");Order1(b);printf("\n\n");
	printf(" 中序遍历序列:\n");
	printf("   非递归算法:");InOrder(b);printf("\n");
	printf(" 后序遍历序列:\n");
	printf("   非递归算法:");PostOrder(b);printf("\n");
	printf("     树的深度:");
	int d=BTreeDepth(b);printf("%d\n",d);
}

 运行结果:

       二叉树:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

 层次遍历序列:A B C D E F G H I J K L M N

 先序遍历序列:
     递归算法:A B D E H J K L M N C F G I
   非递归算法:A B D E H J K L M N C F G I

 中序遍历序列:
   非递归算法:D B J H L K M N E A F C G I

 后序遍历序列:
   非递归算法:D J L N M K H E B F I G C A

     树的深度:7

 

分享到:
评论

相关推荐

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    按凹入表形式横向打印任意二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。

    二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...

    二叉树的基本运算

    建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...

    二叉树相关算法的实验验证+判别给定二叉树是否为完全二叉树。

    1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...

    二叉树_二叉树遍历_

    1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...

    二叉树课程设计的实验报告

    3 程序所能达到的功能:生成一个新的二叉树,实现对二叉树的先序,中序,后序和层次遍历,计算二叉树的深度,结点数,叶结点数,。 4 测式数据: A生成一个新的二叉树后,直接在键盘上按要求输入字符,可以依次输入...

    数据结构试验3二叉树建立,遍历等

    数据结构试验3二叉树建立,遍历等操作代码及运行结果。 实验内容: 采用二叉链表存储,实现二叉树的创建、遍历(递归)、赫夫曼编码和译码等典型操作。 1. 编程实现如下功能: (1)假设二叉树的结点值是字符型,...

    二叉树的建立及遍历

    如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。 [基本要求] 已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个算法: (1)构造一棵二叉树...

    数据结构 树和二叉树ppt教程

    详细的树和二叉树的教程,还附有源代码 部分代码如下: 二叉树头文件.h //二叉树的二叉链表存储表示 typedef struct BiTNode {TElemType data; //二叉树结点数据域 struct BiTNode *lchild,*rchild; //左右孩子指针...

    数据结构--二叉树--思维导图.pdf

    "数据结构--二叉树--思维导图" 二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个孩子节点,分别是左子树和右子树。二叉树可以用来存储大量数据,并且可以快速地查找、插入和删除数据。 二叉树的...

    二叉树的建立与遍历

    按先序序列构造一棵二叉链表表示的二叉树T,并输出该T的中序遍历序列。实现提示: 1) 按先序序列建立一棵二叉树时,先构造根结点,再构造根的左子树,然后构造右子树;每棵子树又都是二叉树,所以构造一棵子树的过程...

    根据先序与中序遍历结果建立二叉树

    根据先序与中序遍历结果建立二叉树 输入为: 第一行:二叉树的先序遍历结果 第二行:二叉树的中序遍历结果 例如: ①输入aa则返回的指针指向的二叉树应该就是仅有一个节点,值为a. ②输入123213则返回的指针指向...

    数据结构实验-二叉树的基本操作

    运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。 输入格式:AB#C##D## 二、实验目的 掌握二叉链表及二叉树的...

    数据结构实验——二叉树的建立和遍历.zip

    1.采用二叉链表作为存储结构,创建一棵二叉树; 2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问...

    二叉树的建立与基本操作

    编写程序实现二叉树的如下操作: 1) 建立二叉链表 2) 二叉树的先序、中序、后序遍历 3) 求解二叉树的叶子结点个数 4) 将二叉树中所有结点的左、右子树相互交换 输入:  扩展二叉树先序序列:ab#d##ce###。其中#...

    数据结构——二叉树有关操作程序

    一)建立二叉树+判空+遍历 (1)以二叉链表作为存储结构,从键盘以先序次序输入各个结点(空格字符表示空树)建立一棵二叉树; (2)对(1)中生成的二叉树进行判空; (3)对(1)中生成的二叉树进行遍历(分别实现...

    二叉树---数据结构

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    数据结构实验 二叉树的遍历方法

    一、实验名称:二叉树的遍历方法 二、实验目的: (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点; (2)掌握二叉树的储存结构的定义及C语言实现; (3)掌握二叉树的三种遍历方法,即先序遍历,中序遍历,...

    C++ 数据库二叉树的实现

    4.掌握计算二叉树的结点个数、二叉树的深度、二叉树的叶子结点和二叉树复制算法。 二、实验内容 1、构造基于先序遍历的二叉链表。 要求:按先序遍历规则,从键盘连续输入二叉树的先序序列,若无孩子结点,则用#代替...

    数据结构二叉树实验头文件

    在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 一棵深度为k,且有2^k-1个结点的...

Global site tag (gtag.js) - Google Analytics