数据结构《二叉树》

二叉树的建立,遍历:先序遍历,中序遍历,后序遍历,非递归先序遍历,层序遍历,以及二叉树的复制,总结点和叶子节点数的统计,树的深度的计算

至于栈和队列代码在另一篇文章

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 200000
#define TRUE 1
#define FALSE 0
#define OK 1 
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int ElemType; 
typedef int Status; 
typedef int TElemType;
void visit(TElemType x){cout<<x<<endl;} //输出节点值

建立二叉树:

typedef struct BiNode{
	TElemType data;
	struct BiNode *lchild,*rchild;
}BiNode,*BiTree; 
Status CreateBiTree(BiTree &T){//建立二叉树 
	TElemType ch; 
	cin>>ch;
	if(ch=='#') T=NULL;
	else{
		T=(BiNode *)malloc(sizeof(BiNode));
		if(!T) exit(OVERFLOW);
		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{
		int m=Depth(T->lchild);
		int n=Depth(T->rchild);
		if(m>n) return (m+1);//取最深
		return (n+1);
	}
}

统计节点数 :

int NodeCount(BiTree T){//统计总节点数 
	if(T==NULL) return 0;
	else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
int LeafCount(BiTree T){//统计叶子节点数 
	if(T==NULL) return 0;
	if(T->lchild==NULL&&T->rchild==NULL) return 1;
	return LeafCount(T->lchild)+LeafCount(T->rchild);
}

先序遍历,中序遍历,后序遍历:

如果是做题的话还是建议返回类型设置成void,血的教训,不然会RE,玄学,有无玄学大师解释一下返回int类型为什么会RE

Status PreOrderTravel(BiTree T){//先序遍历 
	if(T==NULL) return OK;
	else{
		visit(T->data);//先根 
		PreOrderTravel(T->lchild);//再左 
		PreOrderTravel(T->rchild);//再右 
	}
}
Status InOrderTravel(BiTree T){//中序遍历 
	if(T==NULL) return OK;
	else{
		InOrderTravel(T->lchild);//先左 
		visit(T->data); //再根 
		InOrderTravel(T->rchild);//再右 
	}
}
Status PostOrderTravel(BiTree T){//后序遍历 
	if(T==NULL) return OK;
	else{
		PostOrderTravel(T->lchild);//先左 
		PostOrderTravel(T->rchild);//再右 
		visit(T->data);//再根 
	}
}

非递归实现二叉树的先序遍历:

Status StackInOrderTravel(BiTree T){//非递归实现二叉树的先序遍历 
	InitStack(s);
	BiNode *p;
	p=(BiNode *)malloc(sizeof(BiNode));
	p=T;
	while(p||!StackEmpty(s)){
		if(p){
			Push(s,p);p=p->lchild;
		}
		else{
			BiNode *q;
			q=(BiNode *)malloc(sizeof(BiNode));
			Pop(s,q);
			visit(q->data);
			p=q->rchild;
		}
	}
	return OK;
}

队列实现层次遍历:

Status LevelOrder(BiTree T){//队列实现层次遍历 
	SqQueue q;
	InitQueue(q);
	BiNode *p;
	p=(BiNode *)malloc(sizeof(BiNode)); 
	Push(q,T);
	while(!QueueEmpty(q)){
		deQueue(q,p);
		cout<<p->data<<endl;
		if(p->lchild!=NULL) Push(q,p->lchild);
		if(p->rchild!=NULL) Push(q,p->rchild);
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值