您的位置:首页 > 编程语言

二叉树的相关操作代码(继续补全中)

2015-03-27 15:17 429 查看
#ifndef BITREEOPERATION_H
#define BITREEOPERATION_H
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
typedef char ElemType;

typedef struct BiNode{
ElemType data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

//先序建立二叉树
int PreOrderCreateBiTree(BiTree& Root){
char ch;
scanf("%c",&ch);
if(ch==' ')
Root=NULL;
else{
Root=(BiTree)malloc(sizeof(BiNode));
Root->data=ch;//生成根节点
PreOrderCreateBiTree(Root->lchild);//构造左子树
PreOrderCreateBiTree(Root->rchild);//构造右子树
}
return 0;
}

//先序的递归遍历
void PreOrderTraverse(BiTree Root){
if(Root!=NULL){
printf("%c",Root->data);//访问根节点
PreOrderTraverse(Root->lchild);//先序遍历左子树
PreOrderTraverse(Root->rchild);//先序遍历右子树
}
}

//中序的递归遍历
void InOrderTraverse(BiTree Root){
if(Root!=NULL){
PreOrderTraverse(Root->lchild);//中序遍历左子树
printf("%c",Root->data);//访问根节点
PreOrderTraverse(Root->rchild);//中序遍历右子树
}
}

//后序的递归遍历
void PostOrderTraverse(BiTree Root){
if(Root!=NULL){
PreOrderTraverse(Root->lchild);//后序遍历左子树
PreOrderTraverse(Root->rchild);//后序遍历右子树
printf("%c",Root->data);//访问根节点
}
}

//先序的非递归遍历,使用到栈结构
void PreOrderNonRecur(BiTree Root){
std::stack<BiTree> cstack;
BiTree p=Root;
while(p||!cstack.empty()){
if(p){//根指针进栈,访问根节点,遍历左子树
cstack.push(p);
printf("%c",p->data);
p=p->lchild;
}else{//根指针退栈,遍历右子树
p=cstack.top();
cstack.pop();
p=p->rchild;
}
}

}

//中序的非递归遍历
void InOrderNonRecur(BiTree Root){
if(Root!=NULL){
std::stack<BiTree> cstack;
BiTree p=Root;
while(p||!cstack.empty()){
if(p){//根指针进栈,遍历左子树
cstack.push(p);
p=p->lchild;
}else{//根指针退栈,访问根节点,遍历右子树
p=cstack.top();
cstack.pop();
printf("%c",p->data);
p=p->rchild;
}
}
}

}
//后序的非递归遍历比较麻烦些,暂时不讨论

//层序遍历,使用到队列结构
void levelOrderTraverse(BiTree Root){
if(Root!=NULL){
std::queue<BiTree> cqueue;
BiTree p=Root;
cqueue.push(p);
while(!cqueue.empty()){
p=cqueue.front();
cqueue.pop();//根节点出队列
printf("%c",p->data);
if(p->lchild!=NULL)
cqueue.push(p->lchild);
if(p->rchild!=NULL)
cqueue.push(p->rchild);
}
}
}

//递归求树的高度
int getBiTreeHeight(BiTree Root){
if(Root==NULL)
return 0; //空树返回0
else{
int lheight=getBiTreeHeight(Root->lchild);//递归求左子树高度
int rheight=getBiTreeHeight(Root->rchild);//递归求右子树高度
return lheight>rheight? lheight+1:rheight+1;//树的高度为左右子树的最大者
}
}

//求特定节点的父节点
BiTree PreOrderTraverse(BiTree Root,char target,BiTree parent){
if(Root!=NULL){
if(Root->data==target)
return parent;
BiTree lparent=PreOrderTraverse(Root->lchild,target,Root);//先序遍历左子树
if(lparent)
return lparent;
BiTree rparent=PreOrderTraverse(Root->rchild,target,Root);//先序遍历右子树
if(rparent)
return rparent;
}
return NULL;//若返回Null,则代表该子树不存在目标字符
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: