C语言二叉树代码实现

#include<stdio.h>

//#include<string.h>

//#include<math.h>

#include<stdlib.h>

//函数结果状态代码

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define NULL 0

#define MAXSIZE 100

#define MAXTSIZE 100

//Status是函数的类型,其值是函数结果状态代码

typedef int Status;

//声明结点的类型和指向结点的指针类型

//顺序存储结构

typedef int SqBiTree[MAXTSIZE];

//二叉链表存储结构

typedef struct BiNode{

TElemType data;

struct BiNode *lchild,*rchild;//左右孩子指针

}BiNode,*BiTree;

//三叉链表存储结构

typedef struct TriNode{

TElemType data;

struct TriNode *lchild,*parent,*rchild;//左右孩子指针、双亲指针

}TriNode,*TriTree;

//线索二叉树

typedef struct BiThrNode{

int data;

int ltag,rtag;

struct BiThrNode *lchild,*rchild;//左右孩子指针

}BiThrNode,*BiThrTree;

//二叉链表 先序遍历——DLR

Status PreOrderTraverse(BiTree T){

if(T==NULL) return OK;//空二叉树

else{

visit(T);//访问根结点,这里也可以输出根节点printf("%d\t",T->data);

PreOrderTraverse(T->lchild);//递归遍历左子树

PreOrderTraverse(T->rchild);//递归遍历右子树

}

}

//二叉链表 中序遍历——LDR

Status InOrderTraverse(BiTree T){

if(T==NULL) return OK;//空二叉树

else{

InOrderTraverse(T->lchild);//递归遍历左子树

visit(T);//访问根结点

InOrderTraverse(T->rchild);//递归遍历右子树

}

}

//二叉链表 后序遍历——LRD

Status PostOrderTraverse(BiTree T){

if(T==NULL) return OK;//空二叉树

else{

PostOrderTraverse(T->lchild);//递归遍历左子树

PostOrderTraverse(T->rchild);//递归遍历右子树

visit(T);//访问根结点

}

}

//二叉链表 中序遍历——非递归算法

Status InOrderTraverse(BiTree T){

BiTree p;

InitStack(S);//初始化栈

p=T;//指针p指向根结点T

while(p||!StackEmpty(S)){

if(p){

Push(S,p);//当前的根结点p入栈

p=p->lchild;//p指向左子树

}

else{

Pop(S,q);//将栈顶元素弹出,并赋值给q

printf("%c\t",q->data);

p=q->rchild;//p指向右子树

}

}

return OK;

}

//二叉链表 层次遍历(从上到下、从左到右的顺序访问每一个结点)

void LevelOrder(BiNode *b){

BiNode *p;

SqQueue *qu;

InitQueue(qu);//初始化队列

enQueue(qu,b);//根结点指针进入队列

while(!QueueEmpty(qu)){//队列不为空,执行循环

deQueue(qu,p);//结点p出队

printf("%c\t",p->data);//访问结点p

if(p->lchild!=NULL) enQueue(qu,p->lchild);//如果有左子树,则左子树入队

if(p->rchild!=NULL) enQueue(qu,p->rchild);//如果有右子树,则右子树入队

}

}

//二叉链表 按先序遍历建立二叉树

Status CreateBiTree(BiTree &T){

scanf(&ch);//接收键盘输入的字符

if(ch=="#") T=NULL;

else{

if(!(T=(BiNode *)malloc(sizeof(BiNode)))) exit(OVERFLOW);//生成空间存放T

T->data=ch;//生成根结点

CreateBiTree(T->lchild);//构造左子树

CreateBiTree(T->rchild);//构造右子树

}

return OK;

}

//二叉链表 复制二叉树

int Copy(BiTree T,BiTree &NewT){

if(T==NULL){

NewT=NULL;

return 0;

}

else{

NewT=(BiNode *)malloc(sizeof(BiNode));//生成新结点的存储空间

NewT->data=T->data;//复制当前结点数据到新结点

Copy(T->lchild,NewT->lchild);//复制左子树

Copy(T->rchild,NewT->rchild);//复制右子树

}

}

//二叉链表 计算二叉树的深度

int Depth(BiTree T){

if(T==NULL) return 0;

else{

m=Depth(T->lchild);//左子树深度

n=Depth(T->rchild);//右子树深度

if(m>n) return(m+1);

else return(n+1);//+1的原因是因为一开始的根结点的深度没计算进去

}

}

//二叉链表 计算二叉树结点总数

int NodeCount(BiTree T){

if(T==NULL) return 0;

else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;

}

//二叉链表 计算二叉树叶子结点数

int LeadCount(BiTree T){

if(T==NULL) return 0;

if(T->lchild==NULL && T->rchild==NULL) return 1;//左子树和右子树都为空,当前结点是叶子结点

else return LeadCount(T->lchild)+LeadCount(T->rchild);

}

int main(){

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值