关于二叉树,高分!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于二叉树,高分!相关的知识,希望对你有一定的参考价值。
实现一种二叉树的存储结构,并完成以下操作:建立、查找、计算结点数、求高度、三种遍历方式。
用键盘输入一个字符串,按照满二叉树的特点生成一棵二叉树。要求用递归方法生成该二叉树;二叉树的结点最多有左右两个分支,以固定的顺序,有系统的抽取二叉树中各结点,且每个结点恰好被抽取一次。二叉树的遍历是以递归方式进行的,依递归的调用顺序不同,分别实现先序遍历、中序遍历。在程序中要求不同功能分别用单个的函数实现;以链表方式建立二叉树并以先序遍历二叉树的方式输出结点内容,统计二叉树叶子个数。
/*
包括二叉树的创建和遍历
*/
//头文件
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
//预定义宏常量
#define OK 1
#define ERROR -1
#define ENDFLAG '#'
typedef char TelemType;
typedef int status;
//二叉树的存储结构
typedef struct BiTNode
TelemType data;
struct BiTNode *lchild,*rchild;
BiTNode,*BiTree;
//全局变量,表示叶子个数
int m=0;
//二叉树的创建
status CreateBiTree(BiTree *T)
// 先序创建
TelemType ch;
scanf("%c",&ch);
if(ch==ENDFLAG) *T=NULL;
else
if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("\nOut of space.");
getch();
exit(0);
(*T)->data=ch; //生成根结点
CreateBiTree(&((*T)->lchild));//左子树
CreateBiTree(&((*T)->rchild));//右子树
return OK;
//先序遍历
status PreOrderTraverse(BiTree T)
if(T)
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
return OK;
/*
//中序
status InOrderTraverse(BiTree T)
if(T)
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
return OK;
//后序
status PostOrderTraverse(BiTree T)
if(T)
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data);
return OK;
*/
/*
用队列 层次遍历
*/
//存储定义
typedef char QElemType;
//typedef int status;
typedef struct Queue
QElemType data;
struct Queue *next;
Queue;
//头指针和尾指针
typedef struct
Queue *front;
Queue *rear;
LinkQueue;
//初始化队列
status InitQueue(LinkQueue *q)
q->front=q->rear =NULL; //----无头结点
return OK;
/*判断队列是否为空*/
status QueueEmpty(LinkQueue *Q)
return (Q->front==NULL)&&(Q->rear==NULL);
/*实际上只须判断队头指针是否为空即可*/
//入队
void EnQueue(LinkQueue *q,QElemType e)
Queue *p;
p=(Queue *)malloc(sizeof(Queue));/*申请新结点*/
p->data=e;
p->next=NULL;
if(QueueEmpty(q))
q->front=q->rear=p;
else /*x插入非空队列的尾*/
q->rear->next=p; /*p链到原队尾结点后*/
q->rear=p;/*队尾指针指向新的尾*/
//出队
QElemType DeQueue(LinkQueue *q)
Queue *p;
QElemType e;
if(QueueEmpty(q))
printf("Queue underflow\n");/*下溢*/
exit(1) ;
p=q->front;/*指向对头结点*/
e=p->data;/*保存对头结点的数据*/
q->front=p->next;/*将对头结点从链上摘下*/
if(q->rear==p)/*原队中只有一个结点,删去后队列变空,此时队头指针已为空*/
q->rear=NULL;
free(p);/*释放被删队头结点*/
return e;/*返回原队头数据*/
/*层次遍历思想 递归
a.根结点入队列
b.原队左子树的左右孩子(非空)入队列
c.原队右子数的左右孩子(非空)入队列
*/
//层次遍历入队列
status Arrange(BiTree T,LinkQueue *Q)
if(T)
EnQueue(Q,T->data);
Arrange(T->lchild,Q);
Arrange(T->rchild,Q);
return OK;
//从队列中输出各元素
status ArrangementTraverse(BiTree T)
char e;
LinkQueue Q;
InitQueue(&Q);
if(T)
Arrange(T,&Q);//递归调用
while(!QueueEmpty(&Q))
e=DeQueue(&Q);
printf("%c",e);
return OK;
//求二叉树的叶结点个数
status NumberLeaves(BiTree T)
//先序遍历得到叶结点的数目
//m=0;
if(T)
if(T->lchild==NULL&&T->rchild==NULL) m++;
NumberLeaves(T->lchild);
NumberLeaves(T->rchild);
return OK;
int btnodeheight(BiTree b)
int lchildh,rchildh;
if (b==NULL) return(0);
else
lchildh=btnodeheight(b->lchild);
rchildh=btnodeheight(b->rchild);
return (lchildh>rchildh)? (lchildh+1):(rchildh+1);
/*
//一个比较函数
status Max(int m, int n)
if (m > n)
return m;
else
return n;
//获取二叉树的高度
status HighBitree(BiTree t)
if (t == NULL)
return 0;
else
return 1 + Max(HighBitree(t->lchild), HighBitree(t->rchild));
*/
//主函数
void main()
BiTree T;
printf("请创建二叉树:\n");
CreateBiTree(&T);
NumberLeaves(T);
printf("叶节点个数为:");
printf("%d",m);
printf("\n二叉树的高度为:");
printf("%d",btnodeheight(T));
// printf("%d",HighBitree(T));
printf("\n先序遍历:\n");
PreOrderTraverse(T);
/* printf("\n中序遍历:\n");
InOrderTraverse(T);
printf("\n后序遍历:\n");
PostOrderTraverse(T);*/
printf("\n层次遍历\n");
ArrangementTraverse(T);
printf("\n");
参考技术A 这些函数都挺好编的,只是在创建的时候我是用先序递归建的树,不知道可不可以。 参考技术B 不懂,谢谢!
求POJ上 关于二叉树遍历的题目
参考技术A 最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026)trie树(静态建树、动态建树) (poj2513)
线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)
静态二叉检索树. (poj2482,poj2352)
树状树组(poj1195,poj3321)
最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446)
以上是关于关于二叉树,高分!的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 2049统计最高分的节点数目[dfs 二叉树] HERODING的LeetCode之路
[leetcode] 2049 统计最高分的节点数目 | dfs二叉树