/*设计算法将一个以二叉链表存储的二叉树按顺序方式存储到一位数阻中
思路
设根节点的编号为一,并设置一个队列,先把根节点入队。当队列非空时,将队列元素出队,将出队结点的数据以编号为下标存储到数组中,然后考察该节点,若该节点有左孩子
将左孩子的数据和编号信息入队,若该节点有有孩子,将有孩子的数据和编号信息入队。本体采用顺序对列,其数组元素的结构定义如下
:
typedef struct QNODE
P
Binode *ptr;
int num;
}QNODE;
*/
//二叉链表转换为顺序存储算法
void BiToSeq(Binode *T,ElementType seq[],int n)
{
for(int i=1;i<=n;i++)
seq[i]=0;//数组初始化,0代表虚节点
int front=rear=-1;//顺序队列初始化
if(T!=NULL)
{
tq.ptr=T;
tq.num=1;
Q[++rear]=T;//根节点入队
while(front!rear)
{
tq=Q[++front];//结点写入数组
p=tq.ptr;
i=tq.num;
seq[i]=p->data;
if(p->lchild!=NULL)
{
tq.ptr=p->lchild;
tq.num=2*i;
Q[++rear]=tq;//左孩子入队
}
if(p->rchild)
{
tq.ptr=p->rchild;
tq.num=2*i+1;
Q[++rear]=tq;//右孩子入队
}
}
}
}
//已知深度为h的二叉树采用顺序存储的结构存放与数组BT[1...2^h-1】中,编写非递归算法产生该二叉树的二叉链表结构
解答
二叉树的顺序存储是按完全二叉树以层次顺序进行存储的,设虚节点用0表示。可以采用一个队列,现将二叉树的根结点(即数组的第一个元素简历对应二叉树的根节点)并如队列,
然后对队列中的元素依次进行出队并考察该节点,若该节点有左孩子,则在二叉链表中建立该节点的左孩子并入队,若该节点有右孩子,则在二叉链表中建立该节点的右孩子
并入队。
队列的存储结构
typedef struct QNode
{
Binode *ptr;
int num;
}Qnode;
//顺序存储转化为二叉链表算法
void SeqToBi(Binode *T,ElementType BT[],int n)
{
len=pow(2,n);//存放二叉树的数组长度
T=new Binode;//建立建立根节点
T->data=BT[1];
front=-1;
rear=-1;//顺序队列收为节点初始化
tq.ptr=T;
Q[++rear]tq;
tq.num=1;
while(front!=rear)//当队列不了空是循环
{
tq=Q[++front];
p=tq.ptr;
i=tq.num;
if(BT[2*i]==0||2*i>len)
{
p->lchild=NULL;//左子树为空
}
else
{
p->lchild=new Binode;
p->lchild->data=BT[2*i];
tq.ptr=p=>lchild;
tq.num=2*i;
Q[++rear]=tq;//左孩子入队
}
if(BT[2*i+1]==0||2*i+1>len)
p->rchild=NULL;
else
{
p->rchild=new Binode;
p->rchild->data=BT[2*i+1];
tq.ptr=p->rchild;
tq.num=2*i+1;
Q[++rear]=tq;//右孩子入队
}
}
}
//设一棵完全二叉树顺序存储在数组标题【1..n]中,写出非递归的前序遍历算法
void PreOrder(ElemType tree[],int n)
{
i=1;
top=-1;
while(i<=n||top>-1)
{
while(i<=n)
{
cout<<tree[i];
s[++top]=i;
i=i*2;
}
if(top>-1)
{
i=s[top--];
i=2*i+1;
}
}
//一棵具有n个结点的二叉树采用顺序存储结构,编写算法队该二叉树进行前序遍历
void PreOrder(ElemType tree[],int n)
{
i=1;
top=-1;
while(i<=n||top>-1)
{
while(i<=n)
{
if(tree[i]!=0)
cout<<tree[i];
s[++top]=i;
i=i*2;
}
if(top>-1)
{
i=s[top--];
i=2*i+1;
}
}
//已知深度为h的二叉树采用顺序存储结构存放于数组BT[1...2^h-1]中,编写算法求二叉树中叶子结点的个数
二叉树采用顺序存储结构呢,是按完全二叉树的形式存储的,对于非完全二叉树要补上虚节点。由于题目给的结点值是非零正整数,则虚节点可以用零填充
因此某结点是叶子结点的条件是
1:结点I没有左右孩子
2:及热点I的左右孩子都是虚节点
int leaves(int bt[],int n)
{
int len=pow(2,h)-1;
foe(i=1;i<=len;i++)
{
if(BT[i]!=0)
if BT[i*2]>len)
count++;
else if(BT[2*i]!=0)&&BT[2*i+1]!=0&&2*i+1<len)
count++;
}
return count;
}