數據結構遍歷什麼意思?
數據結構中"遍歷"是什麼意思?
所謂遍歷(Traversal)是指沿著某條搜索路線,依次對樹中每個結點均做一次且僅做一次訪問。訪問結點所做的操作依賴於具體的應用問題。
遍歷是二叉樹上最重要的運算之一,是二叉樹上進行其它運算之基礎。
遍歷方案
1.遍歷方案
從二叉樹的遞歸定義可知,一棵非空的二叉樹由根結點及左、右子樹這三個基本部分組成。因此,在任一給定結點上,可以按某種次序執行三個操作:
1)訪問結點本身(N),
2)遍歷該結點的左子樹(L),
3)遍歷該結點的右子樹(R)。
以上三種操作有六種執行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三種次序與後三種次序對稱,故只討論先左後右的前三種次序。
2.三種遍歷的命名
根據訪問結點操作發生位置命名:
① NLR:前序遍歷(PreorderTraversal亦稱(先序遍歷))
——訪問結點的操作發生在遍歷其左右子樹之前。
② LNR:中序遍歷(InorderTraversal)
——訪問結點的操作發生在遍歷其左右子樹之中(間)。
③ LRN:後序遍歷(PostorderTraversal)
——訪問結點的操作發生在遍歷其左右子樹之後。
注意:
由於被訪問的結點必是某子樹的根,所以N(Node)、L(Left subtlee)和R(Right subtree)又可解釋為根、根的左子樹和根的右子樹。NLR、LNR和LRN分別又稱為先根遍歷、中根遍歷和後根遍歷。
遍歷算法
1.中序遍歷的遞歸算法定義:
若二叉樹非空,則依次執行如下操作:
(1)遍歷左子樹;
(2)訪問根結點;
(3)遍歷右子樹。
2.先序遍歷的遞歸算法定義:
若二叉樹非空,則依次執行如下操作:
(1) 訪問根結點;
(2) 遍歷左子樹;
(3) 遍歷右子樹。
3.後序遍歷得遞歸算法定義:
若二叉樹非空,則依次執行如下操作:
(1)遍歷左子樹;
(2)遍歷右子樹;
(3)訪問根結點。
4.中序遍歷的算法實現
用二叉鏈表做為存儲結構,中序遍歷算法可描述為:
void InOrder(BinTree T)
{ //算法裡①~⑥是為了說明執行過程加入的標號
① if(T) { // 如果二叉樹非空
② InOrder(T->lchild);
③ printf("%c",T->data); // 訪問結點
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder
遍歷序列
1.遍歷二叉樹的執行蹤跡
三種遞歸遍歷算法的搜索路線相同(如下圖虛線所示)。
具體線路為:
從根結點出發,逆時針沿著二叉樹外緣移動,對每個結點均途徑三次,最後回到根結點。
2.遍歷序列
(1) 中序序列
中序遍歷二叉樹時,對結點的訪問次序為中序序列
【例】中序遍歷上圖所示的二叉樹時,得到的中序序列為:
D B A E C F
(2) 先序序列
先序遍歷二叉樹時,對結點的......
數據結構題目:求三個遍歷分別是什麼 15分
1、先觀察中序遍歷第一個元素A,它應該是整棵樹中最左的節點;2、再觀察後序遍歷最後一個元素(也是A),他是整棵樹中最中間的節點;3、結合上述兩點,可以確定A是樹的根節點,而且,這棵樹沒有左子樹;4、接下來觀察後序遍歷中的B,他在後序遍歷中是A之前的元素,而且結合這棵樹沒有左子樹這一 點,可以確定,B是A的直接右孩子;5、確定了A、B的位置後,可以觀察中序遍歷樹,A和B之間有EHCF,這就證明了EHCF都是B的左子孫,只要確定EHCF之間的位置關係就可以把它鏈接上B了;(第6步會說明)6、為了確定EHCF的相對位置關係,我們先觀察中序遍歷中,他們的順序是EHCF,而後序遍歷中他們是HEFC,經過幾次嘗試後,很容易就會發現正確的相對位置了;7、剩下的IGD也可以按理推斷出來
數據結構 圖的遍歷
圖的遍歷:#include
#define INFINITY 0
#define MAX_VERTEX_NUM 20
typedef int VRType,InfoType;
typedef char VertexType;
typedef struct ArcCell{
VRType adj;//VrType是頂點關係類型,對無權圖,用1或0表示相鄰否,對有權圖為權值類型
InfoType *info;
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;//圖的當前頂點數和弧數
}MGraph;
int LocateVex(MGraph G,VertexType v){
int i;
for(i=0;i
if(G.vexs[i]==v)
{
return i;
break;
}
i++;
}
if(i>=G.vexnum) return -1;
}
int CreateUDN(MGraph &G){//創建無向網
int IncInfo,i,k,j,w;
VertexType v1,v2;
printf("開始構造一個無向網\n");
printf("請輸入圖的頂點數 邊數 弧是否包含其他信息\n");
scanf("%d%d%d",&G.vexnum,&G.arcnum,&IncInfo);
printf("輸入各頂點元素");
for(i=0;i
for(i=0;i
for(j=0;j
G.arcs[i][j].adj=INFINITY;
G.arcs[i][j].info=NULL;
}
for(k=0;k
printf("輸入一條邊依附的頂點及權:");
scanf("\n%c%c%d",&v1,&v2,&w);
i=LocateVex(G,v1);//確定v1和v2在G中的位置
j=LocateVex(G,v2);
G.arcs[i][j].adj=w;
if(IncInfo) {
printf("輸入弧包含的信息:");
scanf("%d",&G.arcs[i][j].info);
}
G.arcs[j][i]=G.arcs[i][j];
}
return 1;
}
void DispGraph(MGraph G){//輸出圖的鄰接矩陣表示
int i,j;
for(i=0;i
{
for(j=0;j
數據結構中樹的遍歷是什麼意思?
按字面理解就明白了,就是全部訪問經歷一遍。
數據結構順序表的遍歷操作要怎麼寫,急急急急!謝謝~
臨時幫你編了一個程序
#include
using namespace std;
void visit(int x)
{
cout<
}
void trave(int a[],int n,void (*visit)(int))
{
for(int i=0;i
visit(a[i]);
}
void main()
{
int a[]={1,2,3,4,5};
trave(a,5,visit);
}
所以實現上面的代碼很簡單
typedef Elem int;
void visit(iElem x)
{
cout<
}
SqList Traverse(SqList L,void (*visit)(Elem))
{
for(int i=0;i
visit(L.base[i]);
return L;
}
數據結構 深度優先遍歷
我幫你複習一下圖的知識:
深度優先遍歷:
深度優先就是從樹的某個節點開始搜索,查看它所有的領結點,如果這個鄰接點的無其他鄰接點,則忽略該節,再次訪問下個節,以此類推,一直到訪問到的鄰接點再沒有其它的鄰接點為止,這個節點就是開始,然後依此回退。訪問中要將訪問過的節點作標記。
廣度優先遍歷:
廣度優先就是從樹的某個節點開始搜索,將他的所有的節點先用隊列機制保存,找完節點後,處理隊列中的節點,處理時,如果某個節點又有鄰接點就進隊列,以此訪問完整個樹,這個訪問相當與二叉樹的層次遍歷訪問。
我的語言表達能力有限,不知能否看懂。
所以這題,依次往下跑,到H時跑不動了,所以H是頭,然後到I,依次類推,跟二叉樹訪問用後續法差不多。
D項很容易得到。
其實這題用排除法,直接選D。
數據結構 層次遍歷
你的問題大概出在:
1. 初始化時 參數沒使用引用型,又沒有return。void InitSque(BiQue Q)應改為:void InitSque(BiQue &Q)
2. 插入時 參數沒使用引用型,又沒有return。int InSque(BiQue Q,BitTree T)應改為:int InSque(BiQue Q,BitTree &T)
數據結構圖的遍歷代碼
網上找
數據結構鏈表遍歷C語言
求採納!#include "stdio.h"#include "stdlib.h"#define NULL 0#define Error 0typedef struct LNode{int data;struct LNode *next;}LNode,*LinkList;LinkList CreatList(LinkList,int);LinkList CreatList(LinkList L,int n){LinkList p;int i;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;for(i=n;i>0;--i){p=(LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next;L->next=p;}return L;}void Getelem(LinkList L)//遍歷鏈表{LinkList q;q=L->next;for(q->next;q;q=q->next)printf("%d",q->data);}void main(){LinkList L;int a;puts("請輸入鏈表長度:");scanf("%d",&a);L=CreatList(L,a); //L要接收函數返回指針Getelem(L);}