A. 什么是二叉树的顺序存储
二叉树的顺序存储是将二叉树的所有结点,按照一定的次序,存储到一片连续的存储单元中
二叉树的顺序存储必须将结点排成一个适当的线性序列,使得结点在这个序列中的相应位置能反映出结点之间的逻辑关系。这种结构特别适用于近似满二叉树。
在一棵具有n个结点的近似满二叉树中,当从树根起,自上层到下层,逐层从左到右给所有结点编号时,就能得到一个足以反映整个二叉树结构的线性序列。其中每个结点的编号就作为结点。
(1)二叉树的顺序存储结构如下图扩展阅读:
二叉树的性质:
1、二叉树第i层上的结点数目最多为2{i-1}(i≥1)。
2、深度为k的二叉树至多有2{k}-1个结点(k≥1)。
3、包含n个结点的二叉树的高度至少为log2(n+1)。
4、在任意一棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。
参考资料来源:网络-二叉树
B. 二叉树的存储结构是怎样的有哪些类型的存储结构对应的c语言描述是
楼上回答的是树的存储,不是二叉树的存储,主要如下:
1、顺序存储:适用于完全二叉树,如果根从1开始编号,则第i结点的左孩子编号为2i,右孩子为2i+1,双亲编号为(i/2)下取整,空间紧密
2、二叉链表:适用于普通二叉树,每个结点除了数据外,还有分别指向左右孩子结点的指针,存储n个结点有n+1个空指针域,存储密度小于顺序存储,但是适用范围广,缺陷是正常遍历只能从双亲向孩子,退回来一般需要借助栈(或者用递归,其实也是栈)
3、三叉链表:同样适用于普通二叉树,结点除了数据外,还有左右孩子与双亲的指针,存储密度低于二叉链表,但是可以非常方便地在二叉树中遍历,不需要其他辅助工具
C. 1、二叉树采用顺序存储结构进行存储,如图所示
答案如下:
D. 二叉树的顺序存储结构数据A B C D E
二叉树结构链式图:
A
/
\
B
C
/
\
D
E
前序遍历:(根,左,右):
A
->
B -> D -> E -> C中序遍历:(左,根,右):
D -> B -> E -> A -> C后序遍历:(左,右,根):
D -> E -> B -> C -> A
前序
中序
后序
遍历,主要是以根节点做为参考点,进行遍历。(根,左,右)
遍历顺序中
‘根’
在第一个,所以叫前序遍历。(左,根,右) 遍历顺序中
‘根’
在第二个,所以叫中序遍历。(左,右,根) 遍历顺序中
‘根’
在第三个,所以叫后序遍历。
E. 设二叉树bt存储结构如下
字符a是根结点,a的左分支是b,而a没有右分支.
二叉树示意图:
a
/
b
/
cd
//
efg
//
hi
/
j
二叉树的(链式)逻辑结构示意图:
#a^
/
#b#
/
#c^#d#
//
^e^#f^#g^
//
^h^#i^
/
^j^
上述示意图,符号#表示指针域,符号^表示NULL(空指针)
先序遍历序列:abcedfhgij
中序遍历序列:ecbhfdjiga
后序遍历序列:echfjigdba
//C语言测试程序
#include"stdio.h"
#include"stdlib.h"
structtree
{
chardata;
structtree*left;
structtree*right;
};
typedefstructtreetreenode;
typedeftreenode*btree;
btreecreatebtree(char*data,intpos,intmaxPos)//递归创建法
{
btreenewnode;
if(data[pos]==0||pos>maxPos)
{
returnNULL;
}
else
{
newnode=(btree)malloc(sizeof(treenode));
newnode->data=data[pos];
newnode->left=createbtree(data,2*pos,maxPos);
newnode->right=createbtree(data,2*pos+1,maxPos);
returnnewnode;
}
}
voidpreorder(btreeptr)//先序遍历(递归法)
{
if(ptr!=NULL)
{
printf("%C",ptr->data);
preorder(ptr->left);
preorder(ptr->right);
}
}
voidinorder(btreeptr)//中序遍历(递归法)
{
if(ptr!=NULL)
{
inorder(ptr->left);
printf("%C",ptr->data);
inorder(ptr->right);
}
}
voidpostorder(btreeptr)//后序遍历(递归法)
{
if(ptr!=NULL)
{
postorder(ptr->left);
postorder(ptr->right);
printf("%C",ptr->data);
}
}
intmain()
{
btreeroot=NULL;
inti;
chardata[64]={0,'a','b',0,'c','d',0,0,
'e',0,'f','g',0,0,0,0,
0,0,0,0,'h',0,'i',0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,'j',0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0};
root=createbtree(data,1,63);
printf("二叉树的顺序存储内容:");
for(i=1;i<64;i++)
{
if(data[i]==0)
{
printf("^");
}
else
{
printf("%c",data[i]);
}
}
printf(" 二叉树的先序遍历序列:");
preorder(root);
printf(" 二叉树的中序遍历序列:");
inorder(root);
printf(" 二叉树的后序遍历序列:");
postorder(root);
printf(" ");
return0;
}
F. 一个二叉树按顺序方式存储在一个一维数组中,如图:
二叉树按照层序遍历,依次编号,按照编号的顺序,存储在连续存储单元的方式就是二叉树的顺序存储。
G. 二叉树的结构及画法
二叉树的结构有顺序存储和链式存储两种存储结构,其中顺序存储是通过数组实现的,从上到下,从左到右的顺序依次存放根、左孩子、右孩子;链式存储是通过指针实现的,一个结点有三个域:左指针、数据域、右指针。
H. 有一个二叉树按顺序存储结构存放在一维数组中,如下图所示
有
根节点编号1
第二层有2个节点
编号2
3
第三层4个节点
编号4~7
第四层8个节点
编号8~15
第五层6个
8
9
10有2个孩子