二叉树的顺序存贮

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

for(i=0;i<n-1;i++) {p->data=tree[i].data; if(tree[i].rtag= =„0‟) stack[top++]=p; else p->rchild=NULL; q=(NODE*)malloc(sizeof(NODE)); if (tree[i].ltag= =„0‟) p->lchild=q; else {p->lchild=NULL; p=stack[--top]; p->rchild=q;} p=q; }
#include <stdio.h> #define MAXN 100 struct node {char data; struct node *lchild; struct node *rchild; }; typedef struct node NODE; struct lrnode {char data; char ltag,rtag; }; typedef struct lrnode LRNODE;
NODE *transfer(tree,n) LRNODE tree[ ]; int n; { NODE *stack[MAXN],*root,*p,*q; int top,i; if(n= =0) return(NULL); root=(NODE*)malloc(sizeof(NODE)); p=root; top=0;
A B C
Ltag data
rtag
D
F G
E
H
0 1 0 1 0 0 1 1
A B D F C E G H
0 0 1 1 1 1 0 1
查找树中所有结点的右子结点
• 栈:存放rtag=0且尚末找到右子结点的结点的地址 • 从根结点开始往下查找
– rtag=0的结点,依次把这些结点的地址进栈 – ltag=1的结点,此结点的后一个结点一定是栈顶 结点的右子结点,栈顶结点退栈 – 直到树中的结点都找到右子结点为止
如下图所示的二叉树是由有序树T1转换而 来的二叉树,则树T1有(
A
)个叶子结点.
B
E C H D F I
二叉树的存贮
• 二叉树的链接存贮
– 树的标准存贮结构 – 树的逆存贮结构 – 树的扩充标准存贮结构
• 二叉树的顺序存贮结构
把树中的结点按某种适当的次序依次存放到 一组连续的存贮单元中,使得结点的这种适当的 次序能反映树结构的部分信息
1.判断正误: 完全二叉树的某结点若无左孩子,则它必是叶子结点 将一棵树转换成二叉树后,根结点没有左子树. 用二叉树的前序和中序可以导出二叉树的后序遍历.
2.由二叉树的前序和后序遍历序列( A.能 B.不能
)唯一地确定这棵二叉树.
3.有二叉树中序序列为:ABCEFGHD 后序序列:ABFHGEDC, 请画出此二叉树。 4.若一棵二叉树,左右子树均有三个结点,其左子树的前序序列与 中序序列相同,右子树的中序序列与后序序列相同,试构造该树
– ltag=0 结点k后面的结点是k的左子结点 – ltag=1 结点k 无左子结点
• 右指针rchild:指向结点k的右子结点
附加左标志位和右指针
A
B D F E C
Ltag data rchild
G
H
0 1 2 3 4 5 6 7
0 1 0 1 0 0 1 1
A B D F C E G H
4 2 -1 -1 -1 -1 7 -1
p->data=tree[n-1].data; p->lchild=NULL; p->rchild=NULL; return(root); }
G
H
0 1 2 3 4 5 6 7
0 1 0 1 0 0 1 1
A B D F C E G H
4 2 -1 -1 -1 -1 7 -1
查找结点k的左子结点: if(a[p].ltag= =0) printf(“%c”,a[p+1].data); else <结点k无左子结点>; 查找结点k的右子结点: if (a[p].rchild= =-1) <结点k没有右子结点> else printf(“%c”,a[a[p].rchild].data);
• 左标志位:存放结点k后面的结点是否为k的左子结点
– ltag=0 结点k后面的结点是k的左子结点 – ltag=1 结点k 无左子结点
• 右标志位:结点k是否有右子结点
– rtag=0 结点k有右子结点 – rtag=1 结点k无右子结点
ltag
data
rtag
Ltag data
A B C
rtag
A
B
D F E G
C
H
0 1 A B
234 E来自5 G67
8 9 F
10 11 12 H
C D
按前序的存贮形式
A
B D F E C
前序:ABDFCEGH
• 附加左标志位和右指针 • 附加两个标志位
G
H
附加左标志位和右指针
ltag data rchild
• 左标志位:存放结点k后面的结点是否为k的左子结点
查找结点k的按前序的前面结点: if (p-1<0) <结点k没有按前序的前面结点>; else printf(“%c”,a[p-1].data); 查找结点k的按前序的后面结点: if (p+1>=n) <结点k没有按前序的后面结点>; else printf(“%c”,a[p+1].data);
查找结点k的父结点:
if(p-1<0) <结点k没有父结点> else if (a[p-1].ltag= =0) printf(“%c”,a[p-1].data); else { for(q=p-1;a[q].rchild!=p;q--) ; printf(“%c”,a[q].data); }
附加两个标志位
按层次序的存储形式
• 首先对该二叉树中每个结点进行编号,然 后以各结点的编号为下标,把各结点的值 对应存储到一维数组中
– 首先把树根结点的编号定为0 – 然后按层次从上到下,每层从左到右的顺序, 对每一结点进行编号 – 当它的双亲结点的编号为i时,若它为左孩子, 则编号 为2i+1,若为右孩子,则编号为2(i+1)
A
B D F E C
G
H
#define MAXN 100 struct node {int ltag; char data; int rchild; }; typedef struct node NODE; NODE a[MAXN];
附加左标志位和右指针
A
B D F E C
Ltag data rchild
D
F G
E
H
0 1 2 3 4 5 6 7
0 1 0 1 0 0 1 1
A B D F C E G H
0 0 1 1 1 1 0 1
struct lrnode {char data; char ltag,rtag; }; typedef struct rlnnode LRNODE;
查找k的左子结点: if (a[p].ltag= =0) printf(“%c”,a[p+1].data); else <结点k无左子结点>;
相关文档
最新文档