二叉树的基本操作及应用(三)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef char DataType;
int depth=0;
int h1=1;
int nlayer=1;
char ch2;
typedef struct node
{
   DataType data;//节点数据元素
   struct node *lchild;//指向左孩子
   struct node *rchild;//指向右孩子
}BinTNode,*BinTree;
void GetPreOrder(char *last,char *mid,BinTree &T,int len)
{//利用后序和中序建立二叉树
	if(len==0)
	{
		T = NULL;
		return;
	} //取出后序序列中的最后一个节点
	char ch=last[len-1];
	int index=0;  //在中序序列中进行查找根节点,并用index记录其在序列中的索引
	while(mid[index]!=ch)
	{
		index++;
	}
	T=(BinTree)malloc(sizeof(BinTNode)); //给根节点分配空间
	T->data=mid[index];
	GetPreOrder(last,mid,T->lchild,index);//建立左子树
	GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);//建立右子树
}
void GetPostOrder(char *prim,char *mid,BinTree &T,int len)
{//利用先序和中序建立二叉树
	if(len==0)
	{
		T=NULL;
		return;
	}
	char ch=prim[0];//提出先序序列中的第一个节点
	int index=0;
	while(mid[index]!=ch)
	{//在中序序列中查找当前根节点,并用index记录其在序列中的位置
		index++;
	}  //给根节点分配空间
	T=(BinTree)malloc(sizeof(BinTNode));
	T->data=mid[index];
	GetPostOrder(prim+1,mid,T->lchild,index); //建立左子树
	GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);//建立右子树
}
void createB(BinTree &T)
{//扩展先序遍历创建二叉链表
	DataType ch;
	scanf("%c",&ch);
	if(ch=='.')
		T=NULL;
	else
	{
		T=(BinTNode *)malloc(sizeof(BinTNode));
		T->data=ch;
		createB(T->lchild);
		createB(T->rchild);
	}
}
void gradeBT(BinTree &T,DataType ch,int d,int *n)
{/*求ch结点所在层数*/
	if (T)
	{
		d++;
		if(T->data==ch)
			*n=d;
		gradeBT(T->lchild,ch,d,n);
		gradeBT(T->rchild,ch,d,n);
	}
}
void countdef(BinTree T,int &n)
{  /*统计叶子结点数*/
	if(T!=NULL)
	{
		if(T->lchild==NULL&&T->rchild==NULL)
			n++;
		countdef(T->lchild,n);
		countdef(T->rchild,n);
	}
}
int depthhou(BinTree bt)
{//后序遍历求二叉树的高度
	int hl,hr,max;
	if(bt!=NULL)
	{
		hl=depthhou(bt->lchild);
		hr=depthhou(bt->rchild);
		max=hl>hr?hl:hr;
		return (max+1);
	}
	else
		return 0;
}
void depthxian(BinTree bt,int h1)
{//先序遍历求二叉树高度
	if(bt!=NULL)
	{
		if(h1>depth)
			depth=h1;
		depthxian(bt->lchild,h1+1);
		depthxian(bt->rchild,h1+1);
	}
}
void PrintTree(BinTree bt,int nlayer)
{//树状打印二叉树
	if(bt==NULL)
		return;
	PrintTree(bt->rchild,nlayer+1);
	for(int i=0;i<nlayer;i++)
		printf("  ");
	printf("%c\n",bt->data);
	PrintTree(bt->lchild,nlayer+1);
}
void Inorderxian(BinTree &T)
{//先序输出二叉树
	if(T!=NULL)
	{
		printf("%3c",T->data);
		Inorderxian(T->lchild);
		Inorderxian(T->rchild);
	}
}
void Inorderzhong(BinTree &T)
{//中序输出二叉树
	if(T!=NULL)
	{
		Inorderzhong(T->lchild);
		printf("%3c",T->data);
		Inorderzhong(T->rchild);
	}
}
void Inorderhou(BinTree &T)
{//后序输出二叉树
	if(T!=NULL)
	{
		Inorderhou(T->lchild);
		Inorderhou(T->rchild);
		printf("%3c",T->data);
	}
}
void main()
{
	DataType ch;
	BinTree root;
	BinTree T=NULL;
    BinTree BT=NULL;
	int d=0,h=0,l=1,n=0;
	int x,count2=0,count3=0;
	DataType  first[26],mid[26],last[26];
	root=(BinTNode *)malloc(sizeof(BinTNode));
        printf("*****************************************************************\n");
	printf("* 1、扩展先序遍历创建二叉树       2、统计二叉树叶子结点数       *\n");
	printf("* 3、先序遍历求二叉树高度         4、后序遍历求二叉树高度       *\n");
	printf("* 5、按树状打印二叉树             7、利用先序和中序创建二叉树   *\n");
	printf("* 8、利用后序和中序创建二叉树     9、先序输出二叉树             *\n");
	printf("* 10、中序输出二叉树              11、后序输出二叉树            *\n");
	printf("*****************************************************************\n");
	printf("请输入你的选择:\n");
	//第一种方法创建二叉树
	printf("请按照先序遍历的顺序输入需要中序遍历的字符:\n");
	createB(root);
	printf("先序遍历输入二叉树如下:");
	Inorderxian(root);
	printf("\n");
	printf("中序遍历输入二叉树如下:");
	Inorderzhong(root);
	printf("\n");
	printf("后序遍历输入二叉树如下:");
	Inorderhou(root);
	printf("\n\n");
	printf("统计二叉树叶子数:");
	countdef(root,n);
	printf("count=%d\n",n);
	printf("先序遍历输出二叉树的高度:");
	depthxian(root,h1);
	printf("depthxain=%d\n",depth);
	printf("后序遍历输出二叉树的高度:");
	printf("depthhou=%d\n",depthhou(root));
	printf("打印输出二叉树的树状结构:\n");
	PrintTree(root,1);

    //第二种方法创建二叉树
	printf("请输入先序和中序序列:\n");
	scanf("%s%s",first,mid);
	GetPostOrder(first,mid,T, strlen(first));
	printf("打印输出二叉树的树状结构:\n");
	PrintTree(root,1);
	printf("先序遍历输入二叉树如下:");
	Inorderxian(T);
	printf("\n");
	printf("中序遍历输入二叉树如下:");
	Inorderzhong(T);
	printf("\n");
	printf("后序遍历输入二叉树如下:");
	Inorderhou(T);
	printf("\n");
	printf("统计二叉树叶子数:");
	countdef(T,count2);
	printf("count2=%d\n",count2);
	printf("先序遍历输出二叉树的高度:");
	depthxian(T,h1);
	printf("depthxain=%d\n",depth);
	printf("后序遍历输出二叉树的高度:");
	printf("depthhou=%d\n",depthhou(T));
	//第三种方法创建二叉树
	printf("请输入后序和中序序列:\n");
	scanf("%s%s",last,mid);
	GetPreOrder(last,mid,BT,strlen(last));
	printf("打印输出二叉树的树状结构:\n");
	PrintTree(BT,1);
	printf("先序遍历输入二叉树如下:");
	Inorderxian(BT);
	printf("\n");
	printf("中序遍历输入二叉树如下:");
	Inorderzhong(BT);
	printf("\n");
	printf("后序遍历输入二叉树如下:");
	Inorderhou(BT);
	printf("\n");
	printf("统计二叉树叶子数:");
	countdef(BT,count3);
	printf("count3=%d\n",count3);
	printf("先序遍历输出二叉树的高度:");
	depthxian(BT,h1);
	printf("depthxain=%d\n",depth);
	printf("后序遍历输出二叉树的高度:");
	printf("depthhou=%d\n",depthhou(BT));
	printf("\n");
	printf("\n");
}

时间: 2024-11-10 07:31:33

二叉树的基本操作及应用(三)的相关文章

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作: 其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序.中序.后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527 实现代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 //定义二叉树的二叉链表结构 typedef struct Node { char data; struct N

《二叉树的基本操作》

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define NUM 100 //二叉树的最大结点数 6 #define QueueSize 100 //队列初始容量 7 #define TRUE 1 8 #define FALSE 0 9 #define OK 1 10 #define ERROR 0 11 #define OVERFLOW -1 12 13 typedef int

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点 用 数组下标表示法 表示一个节点 二叉树的主要方法 二叉树的创建 二叉树的添加元素 二叉树的删除元素 二叉树的清空 获得二叉树的高度 获得二叉树的节点数 获得某个节点的父亲节点 二叉树的遍历 先序遍历 中序遍历 后序遍历 遍历小结 总结 树的分类有很多种,但基本都是 二叉树 的衍生,今天来学习下二

&lt;二叉树的基本操作(有层次遍历)&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define FALSE 0 #define TRUE 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struc

二叉树基本操作--创建,三种遍历,叶子节点

虽然二叉树的操作很常见,但是认真写写熟悉很重要,特别是typedef, CreateBiTree(BiTNode** T)指针的操作等等,还有就是创建方法,去实际输入值就知道其中的妙处,为-1时为空节点. #include <iostream> using namespace std; //节点的定义 typedef struct BTNode { int data; BTNode* rChild; BTNode* lChild; }BiTNode, *BiTree; //二叉树的创建,先序创

数据结构(复习)--------关于二叉树的基本操作

// // 关于数据结构的总结与复习 Coding //关于二叉树的建立以及层次,其他遍历(递归,非递归)求深度等基本操作 #include <cstdio> #include <cstdlib> //#define _OJ_ typedef struct tree { char data; struct tree *left; struct tree *right; } tree, *Bitree; typedef struct Stack1 { int top, base; B

二叉树的基本操作(含Huffman树)

大二时候写的烂代码,翻出来复习复习(o(╯□╰)o) 代码: #include <stdio.h> #include <stdlib.h> #define Max_Size 100 struct Binode{ char res; struct Binode *lchild,*rchild; }; struct Binode* First_Creat_Bitree(){//建立一棵二叉树 char ch; struct Binode *p; scanf("%c"

数据结构之二叉树的基本操作

#include<stdio.h> #include<malloc.h> #include <stdlib.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data;//数据类型 struct node *lchild;//指向左孩子 struct node *rchild;//指向右孩子 }BTNode; void CreateBTNode(BTNode *&am