数据结构二叉树操作实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

{//广度遍历 CSTACK s; //定义队列对象 NODE *p; if(ht.lc) //根结点存在 { s.InQueue(ht.lc); //根结点入队 for(;p=s.OutQueue();) //队不空,p指向出队的结点 { VISIT_NODE(p,mbox) //访问结点p if(p->lc) s.InQueue(p->lc); //p的左子女存在,入队 if(p->rc) s.InQueue(p->rc); //p的右子女存在,入队 } } } void CTREE::xLastVisit(CListBox &mbox) {//非递归后序遍历 CSTACK s; //定义栈对象 char flg; //标志变量 NODE *p; if(ht.lc) {//根结点存在 s.push(ht.lc); //根结点带“0”标志进栈 while(!s.TestEmpty()) {//当栈不空 p=s.pop(&flg); //出栈,p指向出栈结点,flg为出栈标志 if(flg==0) { s.push(p,1); //带“1”标志进栈 if(p->rc) s.push(p->rc);//右子女带“0”标志进栈 if(p->lc) s.push(p->lc);//左子女带“0”标志进栈 continue; } VISIT_NODE(p,mbox) //访问结点p } } }
void CTREE::Link(CListBox &mbox) {//创建叶节点链表 LINKTYPE *q,*temp; LINKTYPE h; h.next=NULL; q=&h; CSTACK s; NODE *p; int i=0; if(ht.lc) { s.push(ht.lc); while(!s.TestEmpty()) { p=s.pop(); if(p->rc) s.push(p->rc); if(p->lc) s.push(p->lc); if(!p->lc&&!p->rc) { temp=new LINKTYPE; temp->L=p; q->next=temp; temp->next=NULL; VISIT_LINK(temp,mbox); } } } }
while(!s.TestEmpty()) {//当栈不空 p=s.pop(); //出栈结点,该结点指向赋值于p VISIT_NODE(p,mbox) //访问结点p if(p->rc) s.push(p->rc); //p的右子女存在,进栈 if(p->lc) s.push(p->lc); //p的左子女存在,进栈 } } } void CTREE::FreeTree(NODE *t) {//释放二叉链表 if(t) { FreeTree(t->lc); //释放左子树 FreeTree(t->rc); //释放右子树 free(t); //释放根结点 } } void CTREE::xOrVisit(CListBox &mbox) {//非递归中序遍历 CSTACK s; //定义栈对象 NODE *p; for(p=ht.lc;p || !s.TestEmpty();) {//从当前根结点开始,沿左边(左子女)方向,逐个结点进栈 for(;p;p=p->lc) s.push(p); //当前根结点p进栈 if(!s.TestEmpty()) {//当栈不空 p=s.pop(); //出栈结点,该结点指针赋值于p VISIT_NODE(p,mbox) //访问结点p p=p->rc; //p调整指向右子女 } } } void CTREE::LevelVisit(CListBox &mbox)
int CTREE::CountLeaf(node *t) {//统计叶子节点数目 int v=0; if(t!=NULL) { v++; v+= CountLeaf(t->lc); v+=CountLeaf(t->rc); } return v; } int CTREE::Degree1(node *t) {//统计二叉树度为1节点数目 int v=0; if(t!=NULL) { if((t->lc !=NULL && t->rc==NULL) || (t->lc ==NULL && t>rc!=NULL)) v++; v+=Degree1(t->lc)+Degree1(t->rc); } return v; } int CTREE::Degree2(node *t) {//统计二叉树度为2节点数目 int v=0; if (t!=NULL) { if(t->lc!=NULL&&t->lc!=NULL) v++; v+=Degree2(t->lc)+Degree2(t->rc); } return v; } void CTREE::SwapNode(node *t)
设计二叉树二叉链表存储下处理函数 1、统计二叉树中叶子结点数目 2、统计二叉树中只有一个子女(度为1)的结点数目 3、统计二叉树中有两个子女(度为2)的结点数目 4、将二叉树中每个结点的左子女改为右子女,而右子女改为左子女 5、统计二叉树中空指针域个数 6、求二叉树深度 7、将二叉树中的叶子结点按从右至左的顺序建立一个单链表。要求 不破坏二叉树存储结构,单链表元素域记录二叉树叶子结点地址。 8、测试两棵二叉树是否相等 #include "stdafx.h" #include "树遍历.h" #include "TREE.h" #include "STACK.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif extern int vs=0,us=0; #define VISIT_NODE(x,y) CString str;str.Format("%10d",x>e);y.AddString(str); #define VISIT_LINK(x,y) CString str;str.Format("%10d",x>L);y.AddString("叶结点内存地址:"+str);//访问链表 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CTREE::CTREE() { ht.lc=NULL; //设置空树 ht.e=-1; //整型数据最大值 ht2.lc=NULL;
VISIT_NODE(t,mbox) PreVisit(t->lc,mbox); PreVisit(t->rc,mbox); } }
//访问结点t //先序遍历左子树 //先序遍历右子树
void CTREE::OrVisit(NODE *t,CListBox &mbox) {//中序遍历 if(t) { OrVisit(t->lc,mbox); //中序遍历左子树 VISIT_NODE(t,mbox) //访问结点t OrVisit(t-Hale Waihona Puke Baidurc,mbox); //中序遍历右子树 } } void CTREE::LastVisit(NODE *t,CListBox &mbox) {//后序遍历 if(t) { LastVisit(t->lc,mbox); //后序遍历左子树 LastVisit(t->rc,mbox); //后序遍历右子树 VISIT_NODE(t,mbox) //访问结点t } } NODE* CTREE::GetTreeBoot() {//得到树根结点指针 return ht.lc; } void CTREE::xPreVisit(CListBox &mbox) {//非递归先序遍历 CSTACK s; //定义栈对象 NODE *p; if(ht.lc) {//根结点存在 s.push(ht.lc); //根结点进栈
} return v; } bool CTREE::Compare(NODE *p, NODE *q) {//左右子树对比 CSTACK s; bool i=1; if(p->lc) { s.push(p->lc); s.push(q->lc); while(!s.TestEmpty()) { p=s.pop(); q=s.pop(); if((p->rc&&!q->rc||!p->rc&&q->rc)||(p->lc&&!q->lc||!p->lc&&q>lc)) { i=0; break; } if(p->e!=q->e){i=0;break;} //如果左.右子女存在情况相同,比较 子女内容 else{ if(p->rc) s.push(p->rc); if(q->rc) s.push(q->rc); if(p->lc) s.push(p->lc); if(q->lc) s.push(q->lc); } } } return i; }
ht.e=-1; } CTREE::~CTREE() { FreeTree(ht.lc); //释放二叉链表 } void CTREE::InsertElem(ELEM pe) {//向树中插入结点,pe为待插入元素 NODE *p,*s; s=(NODE *)malloc(sizeof(NODE)); s->e=pe; s->lc=s->rc=NULL; //插入结点总是叶结点 for(p=&ht;;) //寻找待插入结点双亲结点指针p { if(p->e<pe) {//待插入结点元素值大于p指向结点元素值时,插入在p结点为根 的右子树上 if(p->rc) p=p->rc; //p的右子女存在,以p的右子女为根 else { p->rc=s;break;} //待插入结点作为p的右子女,插入完成 } else {//待插入结点元素值小于等于p指向结点元素值时,插入在p结点 为根的左子树上 if(p->lc) p=p->lc; //p的左子女存在,以p的左子女为根 else { p->lc=s;break;} //待插入结点作为p的左子女,插入完成 } } } void CTREE::PreVisit(NODE *t,CListBox &mbox) {//先序遍历 if(t) {
{//将二叉树中每个结点的左子女改为右子女,而右子女改为左子女 if(t!=NULL) { SwapNode(t->lc); SwapNode(t->rc); node* temp = t->lc; t->lc = t->rc; t->rc = temp; } } int CTREE::getNum(node *p) {//统计二叉树中空指针域个数 int n=0; if(p!=NULL) { if(p->lc==NULL) n++; if(p->rc==NULL) n++; n+=getNum(p->lc); n+=getNum(p->rc); } return n; } int CTREE::GetDepth(node *p) {//求二叉树深度 int v=0 ,m,k; if(p!=NULL) { v++; m=GetDepth(p->lc); k=GetDepth(p->rc); if(m<k) m=k; v+=m;
相关文档
最新文档