通過遍歷得到順序存儲
① 怎麼把二叉樹的鏈式存儲結構轉化為順序存儲結構
二叉樹的鏈式存儲是指:兩個兒子結點分別用指針指向。而存儲結構值的是:假設該結點在數組中的位置為 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
這樣可以保證每個點都存了並且無重復