一些概念
- 满二叉树:所有的分支节点都存在左子树和右子树,所有的叶子都在最下面一层。
- 完全二叉树:叶子节点只能出现在最下层和次最下层,且最下层的叶子节点集中在树的左部。
创建&初始化二叉树
typedef int datatype;
typedef struct bitnode{
datatype data;
struct bitnode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Inatiate(){
BiTNode *bt;
bt=(BiTNode*)malloc(sizeof(BiTNode));
bt->lchild=NULL;
bt->rchild=NULL;
return bt;
}
BiTree Create_BiTree(datatype x,BiTree lbt,BiTree rbt){
BiTree p;
p=(BiTNode*)malloc(sizeof(BiTNode));
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
return p;
}
BiTree Insert_Bitree(BiTree bt,datatype x,BiTree parent){
BiTree p;
p=(BiTNode*)malloc(sizeof(BiTNode));
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(parent->lchild=NULL)
parent->lchild=p;
else{
p->lchild=parent->lchild;
p->rchild=parent->rchild;
}
return bt;
}
BiTree Delete_Bitree(BiTree bt,BiTree parent){
BiTree p;
p=parent->lchild;
parent->lchild=NULL;
free(p);
return bt;
}
二叉树的三种遍历
递归版
void Visit(BiTree bt){
std::cout<<"当前结点的值为"<<bt->data<<std::endl;
}
void PreOrder(BiTree bt){
if(bt==NULL)
return;
Visit(bt);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
void InOrder(BiTree bt){
if(bt==NULL)
return;
InOrder(bt->lchild);
Visit(bt);
InOrder(bt->rchild);
}
void PostOrder(BiTree bt){
if(bt==NULL)
return;
PostOrder(bt->lchild);
PostOrder(bt->rchild);
Visit(bt);
}
非递归版
void NRPreOrder(BiTree bt){
stack<BiTNode *> mystack;
mystack.push(bt);
while(!mystack.empty()){
BiTNode *top=mystack.top();
mystack.pop();
if(top!=NULL){
Visit(top);
mystack.push(top->rchild);
mystack.push(top->lchild);
}
}
}
void NRInOrder(BiTree bt){
stack<BiTNode *> mystack;
BiTNode *p=bt;
while(p||!mystack.empty()){
while(p){
mystack.push(p);
p=p->lchild;
}
p=mystack.top();
mystack.pop();
Visit(p);
p=p->rchild;
}
}
void NRPostOrder(BiTree bt){
stack<BiTNode *> mystack;
BiTNode *p=bt;
BiTNode *last=NULL;
while(p!=NULL||!mystack.empty()){
if(p!=nullptr){
mystack.push(p);
p=p->lchild;
}
else{
p=mystack.top();
if(p->rchild==nullptr||p->rchild==last){
Visit(p);
mystack.pop();
last=p;
p=nullptr;
}
else{
p=p->rchild;
}
}
}
}
队列实现的层序遍历
void LevelOrder(BiTree bt){
queue<BiTNode *> myqueue;
if(bt==nullptr)
return ;
myqueue.push(bt);
while(!myqueue.empty()){
BiTNode *p=myqueue.front();
Visit(p);
myqueue.pop();
if(p->lchild!=nullptr){
myqueue.push(p->lchild);
}
if(p->rchild!=nullptr){
myqueue.push(p->rchild);
}
}
}