讲评二叉树Word文档下载推荐.docx
《讲评二叉树Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《讲评二叉树Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
if(m<
1||m>
n||s[m]=='
)
cout<
<
"
endl;
else
{
i=m;
while(i!
=0)
{
cout<
s[i];
i=i/2;
}
}
}
intmain()
intn,m,i;
chart[MaxSize],c;
while(cin>
>
n>
m)
cin>
t+1;
Operate(t,n,m);
return0;
求最近公共祖先
设有一棵非空二叉树,其节点值为字符型并假设各值互不相等,采用顺序存储结构表示。
现输入其数组各元素值(空二叉树用'
表示),建立该二叉树。
请设计一个算法,输出编号分别为i和j的两个结点的最近的公共祖先结点的值。
有多组测试数据,每组数据占两行,第一行为两个整数,分别表示编号i和j(i!
=j),第二行为其数组各元素值(空二叉树用'
表示)。
输出编号i和j的最近公共祖先结点的值,若该祖先结点不存在则输出"
35
ABC#D
25
ABCDE#F
A
B
voidOperate(chars[],inti,intj)
intn;
n=strlen(s+1);
if(i<
1||j<
1||i>
n||j>
n||s[i]=='
||s[j]=='
{
=j)
if(i>
j)
i=i/2;
else
j=j/2;
s[i]<
intn,m;
chart[MaxSize];
1002:
判满二叉树
设有一棵非空二叉树,其节点值为字符型并假设各值互不相等,采用二叉链表存储表示。
设计一个算法,判断该二叉树是否为满二叉树。
若是输出"
yes"
,不是则输出"
no"
第一行为一个整数n,表示以下有n组数据,每组数据占一行,为扩展二叉树的前序遍历序列。
若该二叉树是满二叉树输出"
.
2
AB#D##C##
ABD##E##C#F##
no
math.h>
structBiNode//二叉树的结点结构
chardata;
BiNode*lchild,*rchild;
};
classBiTree
public:
BiTree();
//构造函数,初始化一棵二叉树,其前序序列由键盘输入
~BiTree();
//析构函数,释放二叉链表中各结点的存储空间
BiNode*Getroot();
//获得指向根结点的指针
intheight(BiNode*root);
voidnodes(BiNode*root);
private:
BiNode*root;
//指向根结点的头指针
BiNode*Creat();
//有参构造函数调用
voidRelease(BiNode*root);
//析构函数调用
BiTree:
:
BiTree()
this->
root=Creat();
~BiTree()
Release(root);
BiNode*BiTree:
Getroot()
returnroot;
intBiTree:
height(BiNode*root)
if(root==NULL)
return0;
inthl,hr;
hl=height(root->
lchild);
hr=height(root->
rchild);
if(hl>
=hr)
returnhl+1;
else
returnhr+1;
intnum;
voidBiTree:
nodes(BiNode*root)
if(root)
num++;
nodes(root->
Creat()
BiNode*root;
charch;
cin>
ch;
if(ch=='
)root=NULL;
root=newBiNode;
//生成一个结点
root->
data=ch;
lchild=Creat();
//递归建立左子树
rchild=Creat();
//递归建立右子树
Release(BiNode*root)
if(root!
=NULL)
Release(root->
//释放左子树
//释放右子树
deleteroot;
n;
while(n--)
BiTreebt;
//按扩展前序序列创建一棵二叉树
BiNode*root=bt.Getroot();
//获取指向根结点的指针
num=0;
bt.nodes(root);
inth;
h=bt.height(root);
if(num==pow(2,h)-1)
1005:
括号表示法输出二叉树
设计一个算法,采用括号表示法输出该二叉树。
用括号表示法输出二叉树。
6
A##
AB###
A#B##
AB##C##
A(B)
A(,B)
A(B,C)
A(B(,D),C)
A(B(D,E),C(,F))
voidPrint(BiNode*root);
Print(BiNode*root)
root->
data;
if(root->
lchild||root->
rchild)
'
('
;
Print(root->
if(root->
cout<
'
)'
bt.Print(root);
1004:
二叉树的宽度
二叉树的宽度是指二叉树各层结点数的最大值。
设有一棵二叉树,其节点值为字符型并假设各值互不相等,采用二叉链表存储表示。
设计一个算法,输出该二叉树的宽度。
空二叉树的宽度为0。
输出该二叉树的宽度。
3
HDA##C#B##GF#E###
structSeqQueue
BiNode*data[MaxSize];
intlevel[MaxSize];
//存各结点所在层数
intfront,rear;
//定义一个顺序队列Q
intWidth();
Width()
intmax,k,n,i;
BiNode*t;
SeqQueueQ;
if(root==NULL)
Q.front=Q.rear=-1;
//初始为空队列
Q.data[++Q.rear]=root;
//根结点入队
Q.level[Q.rear]=1;
while(Q.front<
Q.rear)
t=Q.data[++Q.front];
k=Q.level[Q.front];
if(t->
lchild!
=NULL)//左孩子入队
Q.data[++Q.rear]=t->
lchild;
Q.level[Q.rear]=k+1;
if(t->
rchild!
=NULL)//右孩子入队
rchild;
}//while
max=0;
k=1;
n=0;
i=0;
while(i<
=Q.rear)
if(Q.level[i]==k)
{
n++;
i++;
}
if(n>
max)max=n;
n=0;
k=k+1;
if(n>
max)//比最后一层的
max=n;
returnmax;
}//else不为空
bt.Width()<
哈夫曼编码
由若干个值无重复的结点及其权值,建立相应的哈夫曼树,要求哈夫曼树中所有左孩子编号小于右孩子编号(以结点的输入顺序做为其编号)。
对所建的哈夫曼树,根据左0右1的原则,对各结点进行编码。
设计一个算法,对给定的若干码串进行相应的解码,并输出解码结果。
有多组测试数据,每组数据由结点信息和码串两部分组成。
结点信息部分的第一行为一个整数n(n<
=20),表示以下有n个结点信息,每个结点信息包括一个字符和一个整数,表示结点值和权值;
码串部分的第一行为一个整数m,表示以下有m个码串(每个串长不超过100),码串由0和1构成,且均有效。
输出各码串对应的解码结果,每个解码结果占一行,每组测试数据后有一空行。
4
A7
G5
O2
D4
10110110111
11111010
GOOD
DOG
iostream.h>
constintMAX=20;
constintMaxLen=100;
//哈夫曼树输入数据的结构
structhuffinit
intweight;
//哈夫曼树结点的结构
structhuffnode
intlchild,rchild,parent;
//哈夫曼树编码的结构
structhuffcode
charcode[MAX+1];
//哈夫曼树类的声明
classHuffTree
HuffTree(huffinitw[],intn);
~HuffTree(){}
voidSelect(int&
min1,int&
min2,intm);
voidEncode();
voidDecode(charcode[]);
huffnodetree[2*MAX-1];
huffcodecd[MAX];
intsize;
voidHuffTree:
Decode(charcode[])
inti=0;
intj=2*(size-1);
//从根开始
while(code[i]!
='
\0'
if(code[i]=='
0'
j=tree[j].lchild;
j=tree[j].rchild;
if(tree[j].lchild==-1)
cout<
cd[j].data;
j=2*(size-1);
i++;