1. c語言中表,樹,棧是什麼
都是數據結構
其中棧包括在表裡,因為表中有線性表。線性表分為棧(後進先出)和隊列(先進先出),而樹是一種區別於表的數據結構,有時將其歸於圖的范疇,特別要注意二叉樹並不是樹,這些數據結構都是基本功,不光學習C語言的人要會,任何學習編程的人都要掌握
2. 計算機c語言中什麼是「二叉樹」
在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。
3. c語言中的樹是什麼意思,集合又怎麼跟編程有關
樹就是相當於圖,裡面有很多個 頂點 很多個邊 邊連接頂點 。
編程可以和任何你能想像出來的東西有關,集合在數據結構裡面關系比較大,比如結構體就是一個集合。
堆是一種數據結構,常用於堆排序演算法。
4. 在二級c語言考試題中看到好幾道樹,二叉樹之類的題,在教材里沒有任何一張提及樹,這個「樹」怎麼考
樹與二叉樹 樹是一種非線性結構,在這種結構中,所有數據元素之間的關系具有明顯的層次特性。而二叉樹也是一種非線性結構,它與樹結構相似,並且樹結構的所有術語都可以用到二叉樹這種數據結構上。二叉樹具有以下兩個特點:① 非空二叉樹只有一個根結點。② 每一個結點最多有兩棵子樹,且分別稱為該結點的左子樹與右子樹。因此,二叉樹中每一個結點的度最大為2,即所有子樹(左子樹或右子樹)也均為二叉樹。對於二叉樹,其概念與性質是考試的重點。要特別注意二叉樹的有關性質。滿二叉樹與完全二叉樹 滿二叉樹與完全二叉樹是兩種特殊形態的二叉樹,對這兩種二叉樹的概念上的理解是考試的重點。(1)滿二叉樹滿二叉樹是指這樣的一種二叉樹:除最後一層外,每一層上的所有結點都有兩個子結點,也就是說,在滿二叉樹中,每一層上的結點數都達到最大值,即在滿二叉樹的第k層有2k–1個結點,且深度為m的滿二叉樹有2m–1個結點。(2)完全二叉樹完全二叉樹是這樣的二叉樹,除最後一層外,每一層上的結點數均達到最大值。二叉樹的遍歷 二叉樹的遍歷是指不重復地訪問二叉樹中的所有結點。二叉樹的遍歷可以分為三種:前序遍歷、中序遍歷、後序遍歷。這三種遍歷方式是每次考試的重點,要求對於某一棵二叉樹應能寫出對應的遍歷序列。一般考這幾個點,你肯定考的是國家二級,選擇前10題和填空前5題都是考的公共知識!多做題!
5. C語言樹和二叉樹
非遞歸先序遍歷:
void TraversalTree_DLR(BinTNode *t)
{ BinTNode *stack[M]; int top;
BinTNode *p;
if( t==NULL ) return;
top = 1; stack[top] = t;
while ( top > 0 )
{ p = stack[top--];
putchar( p->data );
if ( p->rchild != NULL ) stack[ ++top ] = p->rchild ;
if ( p->lchild != NULL ) stack[ ++top ] = p->lchild ;
}
中序:void TraversalTree_LDR(BinTNode *t)
{ BinTNode *stack[M]; int top;
BinTNode *p;
if( t==NULL ) return;
top = 0; p = t;
while ( p != NULL )
{ while ( p != NULL )
{ stack[++top] = p; p = p->lchild; }
do {
p = stack[top--]; putchar( p->data ); p = p->rchild;
} while ( top > 0 && p == NULL);
}
}
後序:
void TraversalTree_LRD(BinTNode *t)
{ struct
{ BinTNode *ptr;
char tag;
} *stack[M];
int top;
BinTNode *p;
if( t==NULL ) return;
top = 0; p = t;
while ( p != NULL )
{ while ( p != NULL )
{ stack[++top].ptr = p; stack[top].tag =『L』;p = p->lchild; }
while( top>0 && ( stack[top].tag ==『R』||
stack[top].tag ==『L』&& stack[top].ptr -> rchild == NULL ))
{ p = stack[top--].ptr; putchar( p->data );}
if(top>0)
{ stack[top].tag =『R』; p = stack[top].ptr->rchild; }
else break; // p = NULL;
}
}
6. C語言中的樹和圖有什麼用
在程序設計當中,樹和圖是兩種常見的數據結構,在計算機技術應用十分廣泛,他們也是兩種思考問題的方式,常用於結局實際問題。樹最直觀的用途就是如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。在資料庫系統中,樹型結構也是信息的重要組織形式之一,一切具有層次關系的問題都可用樹來描述。數據結構的圖就是實際情況的抽象,即邏輯模型,然後通過計算機編程來解決問題。比如一個很復雜的地圖,有很多城市,有很多路,如何找出最短路徑呢?當然是用計算機來算了,就得用圖來表示等等。
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索演算法和索引技術有關。
數據的邏輯結構:指反映數據元素之間的邏輯關系的數據結構,其中的邏輯關系是指數據元素之間的前後件關系,而與他們在計算機中的存儲位置無關。邏輯結構包括:
a.集合
數據結構中的元素之間除了「同屬一個集合」 的相互關系外,別無其他關系;
b.線性結構
數據結構中的元素存在一對一的相互關系;
c.樹形結構
數據結構中的元素存在一對多的相互關系;
d.圖形結構
數據結構中的元素存在多對多的相互關系。
7. C語言數據結構里的 樹
-_-!!
它們之間相互為「樹」,合在一起,其實你應該用「圖」來形容,而不是樹:)
8. c語言_樹
我很奇怪,不用先序中序或者中序後序,你如何能確定一棵唯一的樹呢,不能確定樹如何來遍歷等等。。。。。。。。。。
參考一下
一、 實驗名稱:二叉樹的建立和遍歷
二、 實驗目的:練習遞歸演算法
三、 實驗內容:在上一次實驗的基礎之上增加以下功能
a) 統計二叉樹深度
b) 統計二叉樹中葉子個數
c) 二叉樹中所有左右子樹交換
四、 實驗步驟
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#define size 100
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
} binode, *bitree;
typedef struct
{
bitree data[size];
int tag[100];
int top;
}sqstack;
void initstack(sqstack &t)
{
t.top=-1;
}
int stackempty(sqstack t)
{
if(t.top==-1)
return 1;
else
return 0;
}
int gettop(sqstack &t,bitree &a)
{
if(t.top==-1)
return 0;
else
{
a=t.data[t.top];
t.top--;
return 1;
}
}
int push(sqstack &t,bitree &a)
{
if(t.top==size-1)
return 0;
else
{
t.data[++t.top]=a;
return 1;
}
}
int pop(sqstack &t,bitree &a)
{
if(t.top==-1)
return 0;
else
{
a=t.data[t.top--];
return 1;
}
}
void createbitree(bitree &T,char a[],int la,int ha,char b[],int lb,int hb)
{
int m;
char c;
if(la>ha)
T=NULL;
else
{
if(!(T=(bitree)malloc(sizeof(binode))))
exit(0);
else
{
T->data=a[la];
m=lb;
while(b[m]!=a[la]) m++;
createbitree(T->lchild,a,la+1,la+m-lb,b,lb,m-1);
createbitree(T->rchild,a,la+m-lb+1,ha,b,m+1,hb);
}
}
}
int createbitree(bitree &T)
{
char a[5], b[5];
int i, j, n;
char ch;
n=0;
printf("abcd*badc\n");
scanf("%c", &ch);
while( ch!='*' ) { a[n++]=ch; scanf("%c", &ch);}
for(i=0; i<n; i++) scanf("%c", &b[i]);
createbitree(T, a, 0, n-1, b, 0, n-1);
}
int preorder (bitree p)
{
sqstack S;
initstack(S);
printf("先序遍歷\n");
while(!stackempty(S) || p!=NULL)
{
while(p!=NULL) //指向左子樹
{
printf("%c ",p->data);
push(S,p); //非空時入棧
p=p->lchild;
}
pop(S,p); //指針出棧
p=p->rchild;
}
printf("\n");
}
int inorder (bitree p)
{
sqstack s;
initstack(s);
printf("中序遍歷\n");
while(!stackempty(s)||p)
{
if(p)
{
push(s,p);
p=p->lchild;
}
else
{
pop(s,p);
printf("%c ",p->data);
p=p->rchild;
}
}
return 1;
}
void postorder(bitree p)
{
printf("\n");
sqstack s;
initstack(s);
printf("後序輸出\n");
while(p||!stackempty(s))
{
while(p)
{
s.top++;
s.data[s.top]=p; //子樹根結點進棧
s.tag[s.top]=0; //設此根結點標志初始化為0,表示左右孩子都沒訪問,當訪問完左子樹 tag 變為1
p=p->lchild; //進入左子樹訪問。(左子樹根結點全部進棧)
}
while((s.top>-1)&&(s.tag[s.top]==1))
{
p=s.data[s.top];
cout<<p->data<<" "; //沒有孩子的根結點,也就是它父親的左孩子或右孩子
s.top--;
}
if(s.top>-1)
{
p=s.data[s.top];
s.tag[s.top]=1; //進入右子樹 前,標志tag變為1
p=p->rchild; //進入右子樹
}
else
p=NULL;
}
}
void CountLeaf (bitree T, int& count)
{
if ( T )
{
if ((!T->lchild)&& (!T->rchild)) count++;
CountLeaf(T->lchild , count); //統計左子樹中葉子個數
CountLeaf(T->rchild ,count); //統計右子樹中葉子個數
}
}
int depthval=0,depthLeft=0, depthRight=0;
int Depth (bitree T )
{
if ( !T )
depthval = 0; // depthval是一個全程變數
else
{
depthLeft = Depth( T->lchild );
depthRight = Depth( T->rchild );
depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight);
}
return depthval;
}
void change(bitree T)
{
bitree p,q;
if(T)
{
p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
change(T->lchild);
change(T->rchild);
}
}
void main()
{
bitree T;
int count=0;
createbitree(T) ;
preorder(T);
inorder(T);
postorder(T);
CountLeaf (T,count);
printf("\n");
printf("葉子的個數是:%d\n",count);
Depth ( T );
printf("樹的深度是:%d\n",depthval);
printf("交換後。。。\n");
change(T);
preorder(T);inorder(T);
postorder(T);
}
9. 計算機c語言中 什麼是二叉樹
在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。
二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的 i -1次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。
樹是由一個或多個結點組成的有限集合,其中:
⒈必有一個特定的稱為根(ROOT)的結點;二叉樹
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。
樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹
1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為2;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。
2.樹的深度——組成該樹各結點的最大層次。
3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;
4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。
10. C語言里的二丫樹
那個叫二叉樹啊
樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。
一、樹的概述
樹結構的特點是:它的每一個結點都可以有不止一個直接後繼,除根結點外的所有結點都有且只有一個直接前趨。以下具體地給出樹的定義及樹的數據結構表示。
(一)樹的定義
樹是由一個或多個結點組成的有限集合,其中:
⒈必有一個特定的稱為根(ROOT)的結點;
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。
樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹
1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。
2.樹的深度——組成該樹各結點的最大層次,如上圖,其深度為4;
3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;
4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。
5.樹的表示
樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如上圖可寫成如下形式:
(A(B(E(K,L),F),C(G),D(H(M),I,J)))
5. 2 二叉樹
1.二叉樹的基本形態:
二叉樹也是遞歸定義的,其結點有左右子樹之分,邏輯上二叉樹有五種基本形態:
(1)空二叉樹——(a);
(2)只有一個根結點的二叉樹——(b);
(3)右子樹為空的二叉樹——(c);
(4)左子樹為空的二叉樹——(d);
(5)完全二叉樹——(e)
注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。
2.兩個重要的概念:
(1)完全二叉樹——只有最下面的兩層結點度小於2,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹;
(2)滿二叉樹——除了葉結點外每一個結點都有左右子女且葉結點都處在最底層的二叉樹,。
3.二叉樹的性質
(1) 在二叉樹中,第i層的結點總數不超過2^(i-1);
(2) 深度為h的二叉樹最多有2^h-1個結點(h>=1),最少有h個結點;
(3) 對於任意一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,
則N0=N2+1;
(4) 具有n個結點的完全二叉樹的深度為int(log2n)+1
(5)有N個結點的完全二叉樹各結點如果用順序方式存儲,則結點之間有如下關系:
若I為結點編號則 如果I<>1,則其父結點的編號為I/2;
如果2*I<=N,則其左兒子(即左子樹的根結點)的編號為2*I;若2*I>N,則無左兒子;
如果2*I+1<=N,則其右兒子的結點編號為2*I+1;若2*I+1>N,則無右兒子。
4.二叉樹的存儲結構:
(1)順序存儲方式
type node=record
data:datatype
l,r:integer;
end;
var tr:array[1..n] of node;
(2)鏈表存儲方式,如:
type btree=^node;
node=record
data:datatye;
lchild,rchild:btree;
end;
5.普通樹轉換成二叉樹:凡是兄弟就用線連起來,然後去掉父親到兒子的連線,只留下父母到其第一個子女的連線。
二叉樹很象一株倒懸著的樹,從樹根到大分枝、小分枝、直到葉子把數據聯系起來,這種數據結構就叫做樹結構,簡稱樹。樹中每個分叉點稱為結點,起始結點稱為樹根,任意兩個結點間的連接關系稱為樹枝,結點下面不再有分枝稱為樹葉。結點的前趨結點稱為該結點的"雙親",結點的後趨結點稱為該結點的"子女"或"孩子",同一結點的"子女"之間互稱"兄弟"。
二叉樹:二叉樹是一種十分重要的樹型結構。它的特點是,樹中的每個結點最多隻有兩棵子樹,即樹中任何結點的度數不得大於2。二叉樹的子樹有左右之分,而且,子樹的左右次序是重要的,即使在只有一棵子樹的情況下,也應分清是左子樹還是右子樹。定義:二叉樹是結點的有限集合,這個集合或是空的,或是由一個根結點和兩棵互不相交的稱之為左子樹和右子樹的二叉樹組成。
(三)完全二叉樹
對滿二叉樹,從第一層的結點(即根)開始,由下而上,由左及右,按順序結點編號,便得到滿二叉樹的一個順序表示。據此編號,完全二叉樹定義如下:一棵具有n個結點,深度為K的二叉樹,當且僅當所有結點對應於深度為K的滿二叉樹中編號由1至n的那些結點時,該二叉樹便是完全二叉樹。圖4是一棵完全二叉樹。
三、二叉樹的遍歷
遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為一個線性序列來表示。
設L、D、R分別表示遍歷左子樹、訪問根結點和遍歷右子樹, 則對一棵二叉樹的遍歷有三種情況:DLR(稱為先根次序遍歷),LDR(稱為中根次序遍歷),LRD (稱為後根次序遍歷)。
(1)先序遍歷
訪問根;按先序遍歷左子樹;按先序遍歷右子樹
(2)中序遍歷
按中序遍歷左子樹;訪問根;按中序遍歷右子樹
(3)後序遍歷
按後序遍歷左子樹;按後序遍歷右子樹;訪問根