當前位置:首頁 » 編程語言 » c語言深度

c語言深度

發布時間: 2022-12-20 19:44:37

c語言二叉樹的深度指什麼怎麼求

從根節點到葉子結點一次經過的結點形成樹的一條路徑,最長路徑的長度為樹的深度。根節點的深度為1。

解體思路:

1.如果根節點為空,則深度為0,返回0,遞歸的出口。

2.如果根節點不為空,那麼深度至少為1,然後我們求他們左右子樹的深度,

3.比較左右子樹深度值,返回較大的那一個

4.通過遞歸調用

#include<iostream>
#include<stdlib.h>
usingnamespacestd;

structBinaryTreeNode
{
intm_nValue;
BinaryTreeNode*m_pLeft;
BinaryTreeNode*m_pRight;
};

//創建二叉樹結點
BinaryTreeNode*CreateBinaryTreeNode(intvalue)
{
BinaryTreeNode*pNode=newBinaryTreeNode();
pNode->m_nValue=value;
pNode->m_pLeft=NULL;
pNode->m_pRight=NULL;
returnpNode;
}

//連接二叉樹結點
voidConnectTreeNodes(BinaryTreeNode*pParent,BinaryTreeNode*pLeft,BinaryTreeNode*pRight)
{
if(pParent!=NULL)
{
pParent->m_pLeft=pLeft;
pParent->m_pRight=pRight;
}
}

//求二叉樹深度
intTreeDepth(BinaryTreeNode*pRoot)//計算二叉樹深度
{
if(pRoot==NULL)//如果pRoot為NULL,則深度為0,這也是遞歸的返回條件
return0;
//如果pRoot不為NULL,那麼深度至少為1,所以left和right=1
intleft=1;
intright=1;
left+=TreeDepth(pRoot->m_pLeft);//求出左子樹的深度
right+=TreeDepth(pRoot->m_pRight);//求出右子樹深度

returnleft>right?left:right;//返回深度較大的那一個
}

voidmain()
{
//1
///
//23
///\
//456
///
//7
//創建樹結點
BinaryTreeNode*pNode1=CreateBinaryTreeNode(1);
BinaryTreeNode*pNode2=CreateBinaryTreeNode(2);
BinaryTreeNode*pNode3=CreateBinaryTreeNode(3);
BinaryTreeNode*pNode4=CreateBinaryTreeNode(4);
BinaryTreeNode*pNode5=CreateBinaryTreeNode(5);
BinaryTreeNode*pNode6=CreateBinaryTreeNode(6);
BinaryTreeNode*pNode7=CreateBinaryTreeNode(7);

//連接樹結點
ConnectTreeNodes(pNode1,pNode2,pNode3);
ConnectTreeNodes(pNode2,pNode4,pNode5);
ConnectTreeNodes(pNode3,NULL,pNode6);
ConnectTreeNodes(pNode5,pNode7,NULL);

intdepth=TreeDepth(pNode1);
cout<<depth<<endl;

system("pause");
}

出處:http://www.cnblogs.com/xwdreamer

Ⅱ C語言中,二叉樹的深度指怎樣計算

二叉樹中結點的最大層數稱為二叉樹的深度。計算:就是結點最大層數的個數,這還用計算,一看就知道。

Ⅲ C語言深度總結[全面認識main函數傳遞參數]

        argc和argv是main函數的形式參數。這兩個形式參數的類型是系統規定的。如果main函數要帶參數,就是這兩個類型的參數;否則main函數就沒有參數。

堅持使用標準的意義在於:當你把程序從一個編譯器移到另一個編譯器時,照樣能正常運行。

     由於是 int main( ..) 那麼當時 應當返回 int但是return 2.3 ;也能運行正確,這是因為編譯器自動轉換2.3為int,截斷後為return 2;  

     如果寫為 return "abc";那麼會報錯,  error C2440: 「return」: 無法從「const char [4]」轉換為「int」。

        變數名稱argc和argv是常規的名稱,當然也可以換成其他名稱。那麼,實際參數是如何傳遞給main函數的argc和argv的呢?我們知道,C程序在編譯和鏈接後,都生成一個可執行文件。也可以在命令行下帶參數執行,命令行執行的形式為:可執行文件名稱 參數1 參數2 ... ... 參數n。可執行文件名稱和參數、參數之間均使用空格隔開。

如果按照這種方法執行,命令行字元串將作為實際參數傳遞給main函數。具體為:

(1) 可執行文件名稱和所有參數的個數之和傳遞給argc;

(2) 可執行文件名稱(包括路徑名稱)作為一個字元串,首地址被賦給argv[0],參數1也作為一個字元串,首地址被賦給argv[1],... ...依次類推。

字元串arav[i](i=1,...argc-1)表式第 i 個程序參數,標准C 要求argv[argc]是個null指針,但在有些舊時編譯器中卻不是這樣的,argv向量以及它所指向的字元串必須是可以修改的,並且他們的值在程序執行期間不能被編譯器或操作系統所修改。如果編譯器並不允許大小寫混合的字元串 ,則存儲在argv中的字元串必須採用小寫形式。

1.給main函數傳遞參數只有一種方式,即main(int argc, char *argv[])。第一個參數必須int,第二個(如果有的話)必須是char**或char *argv[]。

2.argc代表傳入參數的個數,argv是一個數組,每個元素都是一個char *。字元串arav[i](i=1,...argc-1)表式第 i 個程序參數,標准C 要求argv[argc]是個null指針。

3.main函數參數理論上支持「無數」個,且參數在進程內支持修改。

Ⅳ 求c語言圖的深度優先遍歷演算法

#define MaxVerNum 100 /* 最大頂點數為*/
typedef enum {False,True} boolean;
#include "stdio.h"
#include "stdlib.h"
boolean visited[MaxVerNum];

typedef struct node /* 表結點*/
{
int adjvex;/* 鄰接點域,一般是放頂點對應的序號或在表頭向量中的下標*/
char Info; /*與邊(或弧)相關的信息*/
struct node * next; /* 指向下一個鄰接點的指針域*/
} EdgeNode;
typedef struct vnode /* 頂點結點*/
{
char vertex; /* 頂點域*/
EdgeNode * firstedge; /* 邊表頭指針*/
} VertexNode;
typedef struct
{
VertexNode adjlist[MaxVerNum]; /* 鄰接表*/
int n,e; /* 頂點數和邊數*/
} ALGraph; /* ALGraph是以鄰接表方式存儲的圖類型*/

//建立一個無向圖的鄰接表存儲的演算法如下:
void CreateALGraph(ALGraph *G)/* 建立有向圖的鄰接表存儲*/
{
int i,j,k;
int N,E;
EdgeNode *p;
printf("請輸入頂點數和邊數:");
scanf("%d %d",&G->n,&G->e);
printf("n=%d,e=%d\n\n",G->n,G->e);
getchar();
for(i=0;i<G->n;i++) /* 建立有n個頂點的頂點表*/
{
printf("請輸入第%d個頂點字元信息(共%d個):",i+1,G->n);
scanf("%c",&(G->adjlist[i].vertex)); /* 讀入頂點信息*/
getchar();
G->adjlist[i].firstedge=NULL; /* 頂點的邊表頭指針設為空*/
}
for(k=0;k<2*G->e;k++) /* 建立邊表*/
{
printf("請輸入邊<Vi,Vj>對應的頂點序號(共%d個):",2*G->e);
scanf("%d %d",&i,&j);/* 讀入邊<Vi,Vj>的頂點對應序號*/
p=(EdgeNode *)malloc(sizeof(EdgeNode)); // 生成新邊表結點p
p->adjvex=j; /* 鄰接點序號為j */
p->next=G->adjlist[i].firstedge;/* 將結點p插入到頂點Vi的鏈表頭部*/
G->adjlist[i].firstedge=p;
}
printf("\n圖已成功創建!對應的鄰接表如下:\n");
for(i=0;i<G->n;i++)
{
p=G->adjlist[i].firstedge;
printf("%c->",G->adjlist[i].vertex);
while(p!=NULL)
{
printf("[ %c ]",G->adjlist[p->adjvex].vertex);
p=p->next;
}
printf("\n");
}
printf("\n");
} /*CreateALGraph*/

int FirstAdjVertex(ALGraph *g,int v)//找圖g中與頂點v相鄰的第一個頂點
{
if(g->adjlist[v].firstedge!=NULL) return (g->adjlist[v].firstedge)->adjvex;
else return 0;
}

int NextAdjVertex(ALGraph *g ,int vi,int vj )//找圖g中與vi相鄰的,相對相鄰頂點vj的下一個相鄰頂點
{
EdgeNode *p;
p=g->adjlist[vi].firstedge;
while( p!=NULL && p->adjvex!=vj) p=p->next;
if(p!=NULL && p->next!=NULL) return p->next->adjvex;
else return 0;
}
void DFS(ALGraph *G,int v) /* 從第v個頂點出發深度優先遍歷圖G */
{
int w;
printf("%c ",G->adjlist[v].vertex);
visited[v]=True; /* 訪問第v個頂點,並把訪問標志置True */
for(w=FirstAdjVertex(G,v);w;w=NextAdjVertex(G,v,w))
if (!visited[w]) DFS(G,w); /* 對v尚未訪問的鄰接頂點w遞歸調用DFS */
}

void DFStraverse(ALGraph *G)
/*深度優先遍歷以鄰接表表示的圖G,而以鄰接矩陣表示時,演算法完全相同*/
{ int i,v;
for(v=0;v<G->n;v++)
visited[v]=False;/*標志向量初始化*/
//for(i=0;i<G->n;i++)
if(!visited[0]) DFS(G,0);
}/*DFS*/

void main()
{
ALGraph G;
CreateALGraph(&G);
printf("該無向圖的深度優先搜索序列為:");
DFStraverse(&G);
printf("\nSuccess!\n");
}

Ⅳ c語言深度優先搜索。代碼

#include<stdlib.h>
#include<stdio.h>

structnode/*圖頂點結構定義*/
{
intvertex;/*頂點數據信息*/
structnode*nextnode;/*指下一頂點的指標*/
};
typedefstructnode*graph;/*圖形的結構新型態*/
structnodehead[9];/*圖形頂點數組*/
intvisited[9];/*遍歷標記數組*/

/********************根據已有的信息建立鄰接表********************/
voidcreategraph(intnode[20][2],intnum)/*num指的是圖的邊數*/
{
graphnewnode;/*指向新節點的指針定義*/
graphptr;
intfrom;/*邊的起點*/
intto;/*邊的終點*/
inti;
for(i=0;i<num;i++)/*讀取邊線信息,插入鄰接表*/
{
from=node[i][0];/*邊線的起點*/
to=node[i][1];/*邊線的終點*/

/*建立新頂點*/
newnode=(graph)malloc(sizeof(structnode));
newnode->vertex=to;/*建立頂點內容*/
newnode->nextnode=NULL;/*設定指標初值*/
ptr=&(head[from]);/*頂點位置*/
while(ptr->nextnode!=NULL)/*遍歷至鏈表尾*/
ptr=ptr->nextnode;/*下一個頂點*/
ptr->nextnode=newnode;/*插入節點*/
}
}

/**********************圖的深度優先搜尋法********************/
voiddfs(intcurrent)
{
graphptr;
visited[current]=1;/*記錄已遍歷過*/
printf("vertex[%d] ",current);/*輸出遍歷頂點值*/
ptr=head[current].nextnode;/*頂點位置*/
while(ptr!=NULL)/*遍歷至鏈表尾*/
{
if(visited[ptr->vertex]==0)/*如過沒遍歷過*/
dfs(ptr->vertex);/*遞回遍歷呼叫*/
ptr=ptr->nextnode;/*下一個頂點*/
}
}

/******************************主程序******************************/
intmain()
{
graphptr;
intnode[20][2]={{1,2},{2,1},/*邊線數組*/
{1,3},{3,1},
{1,4},{4,1},
{2,5},{5,2},
{2,6},{6,2},
{3,7},{7,3},
{4,7},{4,4},
{5,8},{8,5},
{6,7},{7,6},
{7,8},{8,7}};
inti;
//clrscr();
for(i=1;i<=8;i++)/*頂點數組初始化*/
{
head[i].vertex=i;/*設定頂點值*/
head[i].nextnode=NULL;/*指針為空*/
visited[i]=0;/*設定遍歷初始標志*/
}
creategraph(node,20);/*建立鄰接表*/
printf("Contentofthegragh'sADlistis: ");
for(i=1;i<=8;i++)
{
printf("vertex%d->",head[i].vertex);/*頂點值*/
ptr=head[i].nextnode;/*頂點位置*/
while(ptr!=NULL)/*遍歷至鏈表尾*/
{
printf("%d",ptr->vertex);/*印出頂點內容*/
ptr=ptr->nextnode;/*下一個頂點*/
}
printf(" ");/*換行*/
}
printf(" Theendofthedfsare: ");
dfs(1);/*列印輸出遍歷過程*/
printf(" ");/*換行*/
puts("Pressanykeytoquit...");
//getch();
}

Ⅵ c語言 深度怎麼算

二叉樹的遍歷,利用遞歸函數
int Depth(BiTree T){
int depthval,depthleft,depthright;
if(T == NULL) depthval = 0;
else{
depthleft = Depth(T -> lchild);
depthright = Depth(T -> rchild);
depthval = 1 + (depthleft > depthright ? depthleft : depthright);
}//else
return depthval;
}//Depth

熱點內容
wemall微商城源碼 發布:2025-05-14 22:15:20 瀏覽:802
隆地優選交易密碼是什麼 發布:2025-05-14 21:53:23 瀏覽:93
強酸強鹼存儲櫃 發布:2025-05-14 21:45:16 瀏覽:563
車輛參數配置包括什麼 發布:2025-05-14 21:31:03 瀏覽:163
怎麼引入安卓項目 發布:2025-05-14 21:26:39 瀏覽:824
游戲輔編程 發布:2025-05-14 21:18:49 瀏覽:687
三菱plc一段二段密碼什麼意思 發布:2025-05-14 21:17:16 瀏覽:528
電腦開機密碼忘記了怎麼破解 發布:2025-05-14 21:09:40 瀏覽:57
pythondict格式 發布:2025-05-14 21:09:38 瀏覽:886
落葉片拍攝腳本 發布:2025-05-14 20:40:49 瀏覽:799