二叉树的建立,遍历:先序遍历,中序遍历,后序遍历,非递归先序遍历,层序遍历,以及二叉树的复制,总结点和叶子节点数的统计,树的深度的计算
…
至于栈和队列代码在另一篇文章
#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);
}
}