當前位置:首頁 » 編程語言 » 什麼是c語言樹
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

什麼是c語言樹

發布時間: 2022-05-03 22:58:27

c語言中的樹和圖有什麼用

  1. 在程序設計當中,樹和圖是兩種常見的數據結構,在計算機技術應用十分廣泛,他們也是兩種思考問題的方式,常用於結局實際問題。樹最直觀的用途就是如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。在資料庫系統中,樹型結構也是信息的重要組織形式之一,一切具有層次關系的問題都可用樹來描述。數據結構的圖就是實際情況的抽象,即邏輯模型,然後通過計算機編程來解決問題。比如一個很復雜的地圖,有很多城市,有很多路,如何找出最短路徑呢?當然是用計算機來算了,就得用圖來表示等等。

  2. 數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索演算法和索引技術有關。
    數據的邏輯結構:指反映數據元素之間的邏輯關系的數據結構,其中的邏輯關系是指數據元素之間的前後件關系,而與他們在計算機中的存儲位置無關。邏輯結構包括:
    a.集合
    數據結構中的元素之間除了「同屬一個集合」 的相互關系外,別無其他關系;
    b.線性結構
    數據結構中的元素存在一對一的相互關系;
    c.樹形結構
    數據結構中的元素存在一對多的相互關系;
    d.圖形結構
    數據結構中的元素存在多對多的相互關系。

Ⅱ 計算機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.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。

Ⅲ C語言中表,樹,棧是什麼

表,樹,棧並不屬於C語言,其它語言也有表,樹,棧
單純在C語言中,他們也只是一種數據結構的稱呼,並不是一種現成的代碼或函數

實現方法就有好多種,比如用數組和指針,都有分別的程序實現,可以去看《數據結構》C語言描述

Ⅳ 計算機c語言中什麼是「二叉樹」

在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。

Ⅳ 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);
}

Ⅵ c語言二叉樹什麼意思學習要有什麼基礎

二叉樹是一種數據結構
數據結構是一種對數據存儲結構和操作的封裝
你如果要學數據結構的話,要適當了解一門語言,因為數據結構一般是用一種語言來描述的,另外這是對數據的一種抽象,最好了解一下數據的真實儲存結構

Ⅶ 什麼是C語言

C語言是在70年代初問世的。一九七八年由美國電話電報公司(AT&T)貝爾實驗室正式發表了C語言。同時由B.W.Kernighan和D.M.Ritchit合著了著名的「THE
C
PROGRAMMING
LANGUAGE」一書。通常簡稱為《K&R》,也有人稱之為《K&R》標准。但是,在《K&R》中並沒有定義一個完整的標准C語言,後來由美國國家標准學會在此基礎上制定了一個C
語言標准,於一九八三年發表。通常稱之為ANSI
C。
當代最優秀的程序設計語言
早期的C語言主要是用於UNIX系統。由於C語言的強大功能和各方面的優點逐漸為人們認識,到了八十年代,C開始進入其它操作系統,並很快在各類大、中、小和微型計算機上得到了廣泛的使用。成為當代最優秀的程序設計語言之一。
C語言的特點
C語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護。C語言的表現能力和處理能力極強。它不僅具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。由於C語言實現了對硬體的編程操作,因此C語言集高級語言和低級語言的功能於一體。既可用於系統軟體的開發,也適合於應用軟體的開發。此外,C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類各型計算機上,從而形成了多種版本的C語言。
C語言版本
目前最流行的C語言有以下幾種:
·Microsoft
C
或稱
MS
C
·Borland
Turbo
C
或稱
Turbo
C
·AT&T
C
這些C語言版本不僅實現了ANSI
C標准,而且在此基礎上各自作了一些擴充,使之更加方便、完美。
面向對象的程序設計語言
在C的基礎上,一九八三年又由貝爾實驗室的Bjarne
Strou-strup推出了C++。
C++進一步擴充和完善了C語言,成為一種面向
對象的程序設計語言。C++目前流行的最新版本是Borland
C++4.5,Symantec
C++6.1,和Microsoft
VisualC++
2.0。C++提出了一些更為深入的概念,它所支持的這些面向對象的概念容易將問題空間直接地映射到程序空間,為程序員提供了一種與傳統結構程序設計不同的思維方式和編程方法。因而也增加了整個語言的復雜性,掌握起來有一定難度。
C和C++
但是,C是C++的基礎,C++語言和C語言在很多方面是兼容的。因此,掌握了C語言,再進一步學習C++就能以一種熟悉的語法來學習面向對象的語言,從而達到事半功倍的目的。

Ⅷ C語言 樹的生成和遍歷

#include //頭文件
#include
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}
BiTNode,*BiTree;//定義結點類型
BiTree CreateBiTree()//創建樹
{
char p;BiTree T;
scanf("%c",&p);
if(p==' ')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));//為結點開辟空間
T->data=p;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return (T);
}
void PreOrder(BiTree T)//先序
{
if(T!=NULL)
{
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);

}
}
void InOrder(BiTree T)//中序
{
if(T!=NULL)
{
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);

}
}
void PostOrder(BiTree T)//後序
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
void main()//主函數
{
BiTree Ta;
Ta=CreateBiTree();
printf("先序遍歷:");
printf("\n");
PreOrder(Ta);
printf("\n");
printf("中序遍歷:");
printf("\n");
InOrder(Ta);
printf("\n");
printf("後序遍歷:");
printf("\n");
PostOrder(Ta);
}
給你個簡單的例子:
AB***
其中*代表空格
復雜點的例子
ABC**DE*f**g***
其中*代表空格

Ⅸ 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;
}
}