第四章树和二叉树
二叉树的存储结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| typedef int ElemType;
#define MAX_SIZE 100 typedef ElemType SqBitree[MAX_SIZE]; SqBiTree bt;
typedef struct BTNode { ElemType data; struct BTNode *lchild,*rchild; }BTNode,*BiTree;
typedef struct BTNode{ ElemType data; struct BTNode *lchild,*rchild,*parent; }BTNode,*BiTree;
void visit(BiTree T){ cout<<T->data<<" "; }
|
二叉树的遍历递归写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| void PreOrder(BiTree T){ if(T!=NULL){ visit(T); PreOrder(T->lchild); PreOrder(T->rchild); } }
void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } }
void PostOrder(BiTree T){ if(T!=NULL){ PostOrder(T->lchild); PostOrder(T->rchild); visit(T); } }
|
非递归遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| void PreOrder2(BiTree T){ BiTree Stack[MAX_SIZE]; int top=0; BiTree p=T; while(p!=NULL||top>0){ while(p!=NULL){ visit(p); Stack[++top]=p; p=p->lchild; } p=Stack[top--]; p=p->rchild; } }
void InOrder2(BiTree T){ BiTree Stack[MAX_SIZE]; int top=0; BiTree p=T; while(p!=NULL||top>0){ while(p!=NULL){ Stack[++top]=p; p=p->lchild; } p=Stack[top--]; visit(p); p=p->rchild; } }
void PostOrder2(BiTree T){ BiTree Stack1[MAX_SIZE]; BiTree Stack2[MAX_SIZE]; int top1=0,top2=0; BiTree p=T; while(p!=NULL||top1>0){ while(p!=NULL){ Stack[++top1]=p; Stack[++top2]=p; p=p->rchild; } p=Stack1[top--]; p=p->lchild; } while(top2>0){ visit(Stack2[top2]); top2--; } } void PostOrder2(BiTree T) { BiTree Stack[MAX_SIZE]; BiTree p = T, r = NULL; int top = 0; while (p !=NULL || top > 0) { while (p != NULL) { Stack[++top] = p; p = p->lchild; } p = Stack[top]; if (p->rchild && p->rchild != r) { p = p->rchild; } else { p = Stack[top--]; visit(p); r = p; p = NULL; } } }
|
层次遍历
1 2 3 4 5 6 7 8 9 10 11 12 13
| void LevelOrder(BiTree L){ BiTree que[MAX_SIZE]; BiTree q=T; int front=0,rear=0; if(q==NULL) return; que[++rear]=q; while(front<rear){ q=que[++front]; visit(q); if(q->lchild!=NULL) que[++rear]=q->lchild; if(q->rchild!=NULL) que[++rear]=q->rchild; } }
|
线索二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| typedef struct ThreadNode{ ElemType data; struct TreadNode *lchild,*rchild; int ltag,rtag; }ThreadNode,*ThreadTree;
void InThread(ThreadTree &p,ThreadTree &pre){ if(p!=NULL){ InThread(p->lchild,pre); if(p->lchild=NULL){ p->lchild=pre; p->ltag=1; } if(pre!=NULL&&pre->rchild==NULL){ pre->rchild=p; pre->rtag=1; } pre=p; InThread(p->rchild,pre); } } void CreateInThread(ThreadTree T){ ThreadTree pre=NULL; if(T!=NULL){ InThread(T,pre); pre->rchild=NULL; pre->rtag=1; } }
ThreadNode *Firstnote(ThreadNode *p){ while(p->ltag==0)p=p->lchild; return p; }
ThreadNode *Nextnode(ThreadNode *p){ while(p->rtag==0) return Firstnote(p->lchild); return p->rchild; }
void InOrder(ThreadNode *T){ for(ThreadNode *p=Firstnode(T);p!=NULL;p=Nextnode(p)){ visit(p); } }
|
哈夫曼树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #define MAX_NODE 200 typedef struct{ unsigned int weight; unsigned int parent,lchild,rchild; }HTNode;
void Create_Huffman(unsigned n,HTNode HT[],unsigned m){ unsigned int w; int k,j; for(k=1;k<m;k++){ if(k<=n){ cout<<"输入w="; cin>>w; HT[k].weight=w; }else HT[k].weight=0; HT[k].parent=HT[k].lchild=HT[k].rchild=0; } for(k=n+1;k<m;k++){ unsigned w1=32767,w2=w1; int p1=0,p2=0; for(j=1;j<=k-1;j++){ if(HT[k].parent==0){ if(HT[j].weight<w1){ w2=w1; p2=p1; w1=HT[j].weight; p1=j; }else if(HT[j].weight<w2){ w2=HT[j].weight; p2=j; } } } HT[k].lchild=p1; HT[k].rchild=p2; HT[k].weight=w1+w2; HT[p1].parent=k; HT[p2].parent=k; } } void Huff_coding(unsigned n,HTNode HT[],unsigned m){ int k,sp,fp; char *cd,*HC[m]; cd=(char *)malloc(m* sizeof(char)); cd[n]='\0'; for(k=1;k<n+1;k++){ sp=n; int p=k; fp=HT[k].parent; for(;fp!=0;p=fp,fp=HP[p].parent); if(HT[fp].lchild==p)cd[--p]='0'; else cd[--sp]='1'; HC[k]=(char *)malloc((n-sp)*sizeof(char)); strcpy(HC[k],&cd[sp]); } free(cd); }
|
课后作业
//给定权值集合={3,5,7,9,11,12},请构造关于w的一棵Huffman树,并求其加权路径长度WPL
/*
- 集合中找到根节点权值最小的两棵树
- 合并两棵树生成一棵新的树加入到集合中,删除原来的树
- 重复1,2步骤知道只剩下最后一棵树
3,5,7,9,11,12
7,8,9,11,12
9,11,12,15
12,15,20
20,27
47
*/
求二叉树所有的叶子结点数
1 2 3 4 5 6 7 8 9 10
| int ans=0; int count(BTNode *p){ if(p==NULL) return; else{ if(p->lchild==NULL&&p->rchild==NULL) ans++; count(p->lchild); count(p->rchild); } }
|
求二叉树中值为x的结点层号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int leno(BTNode *p,char x,int lev){ if(p==NULL) return 0; else{ if(p->data==x) cout<<lev<<endl; leno(p->lchild,x,lev+1); leno(p->rchild,x,lev+1); } }
int ans=0; int leno(BTNode *p,char x){ if(p!=NULL){ if(p->data==x) cout<<ans<<endl; ++ans; leno(p->lchild,x); leno(p->rchild,x); --ans; } }
|
树顺序存储求i和j结点的最近公共祖先结点的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int forefather(ptree &p,int i,int j){ if(i<1||j<1) return 0; else{ for(;i!=0;i/=2){ for(;j!=0;j/=2){ if(i==j){ return p.HI[i].data; } } } } return 0; }
|
满二叉树已知先序pre,求后序post
1 2 3 4 5 6 7 8 9
| void change(char pre[],int L1,int R1,char post[],int L2,int R2){ if(L1<=R1){ post[R2]=pre[L1]; change(pre,L1+1,(L1+1+R1)/2,post,L2,(L2+R2-1)/2); change(pre,(L1+1+R1)/2+1,R1,post,(L2+R2-1)/2+1,R2-1); } }
|