通过遍历得到顺序存储
① 怎么把二叉树的链式存储结构转化为顺序存储结构
二叉树的链式存储是指:两个儿子结点分别用指针指向。而存储结构值的是:假设该结点在数组中的位置为 i ,则它的左儿子的位置为 2i ,右儿子为 2i + 1. ( i 从1开始)
所以你只要创建一个数组,从链式存储的根节点开始,用中序遍历遍历树,按中序遍历的顺序存储在数组中。即可完成顺序存储结构的转化。
相关的遍历你可以查看相关资料,中序遍历即访问顺序为左儿子-根-右儿子的顺序访问。
希望对你有所帮助。
② 完全二叉树的顺序存储的先序遍历
这你都不会吗?
先序遍历就是(父节点->左子树->右子树);
PASCAL程序如下:
1(二叉链表丛察):
procere preorder(bt:二叉链表定义类型渗耐茄);
begin
if bt^<>nil then
begin
处理bt^.data;
preorder(bt^.lch);
preorder(bt^.rch);
end;
end;
2(顺序存储结构):
procere preorder(i:integer);
begin
if i<>0 then
begin
处理tree[i].data;
preorder(tree[i].lch);
preorder(tree[i].rch);
end;
end;
(你是参加奥赛的吧,加油亩谨哦,要不要一起学习,我的QQ:395195252,MAIL:[email protected]).
③ 二叉树(五)
二叉树可以为空。二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。这是二叉树与树的最主要的差别。注意区分:二叉树、二叉查找树/二叉排序树/二叉搜索树、二叉平衡(查找)树。尘咐
二叉平衡树肯定是一颗二叉排序树。堆不是一颗二叉平衡树。
二叉树与树是不同的,二叉树不等价于分支树最多为二的有序树。当一个结点只包含一个子节点时,对于有序树并无左右孩子之分,而对于二叉树来说依然有左右孩子之分,所以二叉树与树是两种不同的结构。
1) 顺序存储结构:仅仅适用于满或完全二叉树,结点之间的层次关系由性质5确定。
2)二叉链表法:每个节点存储左子树和右子树。三派弊纯叉链表:左子卜凯树、右子树、父节点,总的指针是n+2
3)在有n个结点的二叉链表中,值为非空的链域的个数为n-1。在有N个结点的二叉链表中必定有2N个链域。除根结点外,其余N-1个结点都有一个父结点。所以,一共有N-1个非空链域,其余2N-(N-1)=N+1个为空链域。
4)二叉链存储法也叫孩子兄弟法,左指针指向左孩子,右指针指向右兄弟。而中序遍历的顺序是左孩子,根,右孩子。这种遍历顺序与存储结构不同,因此需要堆栈保存中间结果。而中序遍历检索二叉树时,由于其存储结构跟遍历顺序相符,因此不需要用堆栈。
先序遍历DLR:根节点->左子树->右子树
中序遍历LDR:左子树->根节点->右子树。必须要有中序遍历才能得到一棵二叉树的正确顺序
后续遍历LRD:左子树->右子树->根节点。需要栈的支持。
层次遍历:用一维数组存储二叉树时,总是以层次遍历的顺序存储结点。层次遍历应该借助队列。
对二叉树所有结点做某种处理可在遍历过程中实现;检索(查找)二叉树某个结点,可通过遍历实现;如果能将二叉树线索化,就可以简化遍历算法,提高遍历速度,目的是加快查找结点的前驱或后继的速度。
如何线索化?以中序遍历为例,若能将中序序列中每个结点前趋、后继信息保存起来,以后再遍历二叉树时就可以根据所保存的结点前趋、后继信息对二叉树进行遍历。对于二叉树的线索化,实质上就是遍历一次二叉树,只是在遍历的过程中,检查当前结点左,右指针域是否为空,若为空,将它们改为指向前驱结点或后继结点的线索。前驱就是在这一点之前走过的点,不是下一将要去往的点。
加上结点前趋后继信息(结索)的二叉树称为线索二叉树。n个结点的线索二叉树上每个结点有2个指针域(指向左孩子和右孩子),总共有2n个指针域;一个n个结点的树有n-1条边,那么空指针域= 2n - (n-1) = n + 1,即线索数为n+1。指针域tag为0,存放孩子指针,为1,存放前驱/后继节点指针。
例子 :中序遍历 (BDAC)
一棵左右子树均不空的二叉树在前序线索化后,其中空的链域的个数是1。前序和后续线索化后空链域个数都是1,中序是2。二叉树在线索化后,仍不能有效求解的问题是前序求前序先驱,后序求后序后继。
中序遍历的顺序为:左、根、右,所以对于每一非空的线索,左子树结点的后继为根结点,右子树结点的前驱为根结点,再递归的执行上面的过程,可得非空线索均指向其祖先结点。在中序线索二叉树中,每一非空的线索均指向其祖先结点。
在二叉树上加上结点前趋、后继线索后,可利用线索对二叉树进行遍历,此时,不需栈,也不需递归。基本步骤:
④ 用一维数组存储二叉树时,总是以先序遍历存储结点。为什么是错的
总是以层次序渗族遍历次序存储结点亏陆,这样,完全二叉树可以非常方便地找到孩子兄弟和销喊顷双亲
⑤ 为什么用keySet遍历map,得到了有序结果
Set 是java中一个存储不重复元素,且无序的集合谨仿类。 Map.keyset(),表示将map对象的所有key值已set集合的形式返回,因为map也是无序的,且key值陪晌世也是不可重复的,因此这里用set集合存储key并返回也符合规则。
你可以把你的集合顺序芦肢打乱一下再遍历试试
⑥ 二叉树的顺序存储方式
二叉树按照层序遍历,依次编号,按照编号的顺序,存储在连续存储单元的方式就是二叉树的顺序存储。
⑦ 数据结构实验 线性表中顺序存储结构的基本操作算法(建顺序表,查询,插入,删除,遍历)
有序线性表插入一个数依然有序
#include<stdio.h>
#define MAXSIZE 6
typedef char datatype;
typedef struct SeqList
{
datatypedata[MAXSIZE];
int last;
}SeqList;
SeqList *init_SeqList()
{
SeqList *L;
L=(SeqList*)malloc(sizeof(SeqList));
L->last=-1;
return L;
}
int main()
{ SeqList *L;
int k,x,j;
intInser_SeqList(SeqList *L);
L->last=0;
L=init_SeqList();
for(k=0;k<(MAXSIZE-1);k++)
{ scanf("%d",&x);
L->data[k]=x;
L->last++;
}
Inser_SeqList(L);
for(j=0;j<L->last;j++)
printf("%d",L->data[j]);
return 0;
}
int Inser_SeqList(SeqList *L)
{
int j,x;
if(L->last==MAXSIZE-1)
{printf("表满");
return (-1);
}
L->last++;
for(j=L->last;j>=0;j--)
if(L->data[j]<x)
L->data[L->last]=x;
else
L->data[j+1]=L->data[j];
return 1;
}
你好,上面是我的程序:符合你的1 2 4点 查询、删除操作在课本里找到 写入即可 谢谢
⑧ 知道二叉树的顺序存储,写出中序遍历该二叉树的算法及c语言源程序
用递归写很好写销差的 public class TreeNode{
public TreeNode left,right;
public TreeNode(){this("");}//以棚或上链斗伍是先根遍历
public void preorder(TreeNode p)
{if(p!=null)
preorder(p.left);
preorder(p.right);
}
}
⑨ c语言 二叉树的数组顺序存储
用数组存的话很简单
根节点存为a1
比如说当前节点为ai
那么左儿子存为a2*i
那么右儿子存为a2*i+1
这样可以保证每个点都存了并且无重复