判斷完全二叉樹用C語言編寫,怎麼判斷是否是完全二叉樹 用C 或C語言

2022-03-05 07:26:34 字數 5790 閱讀 3915

1樓:匿名使用者

用一個線性表和一個佇列,表存放的是邊集,佇列用於按層次遍歷。程式流程如下

1 初始化空表、空隊;

2 輸入結點數、指定根結點,輸入邊到表中;

3 根結點進隊;

4 將隊首出隊到p;

5 若表為空,返回1(真)。不空則在表中查詢第一項等於p的邊i。若找到,將邊i的第二項進隊,從表中刪除邊i。若沒有找到,則返回0(假)。

6 若表為空,返回1(真)。不空則在表中查詢第二項等於p的邊i。若找到,將邊i的第一項進隊,從表中刪除邊i。若沒有找到,則返回0(假)。

7 跳到4。

補充提供一個相應的程式**如下,你可以試試

#include

#define n 1024

void main( )

for(i = 0; i < listlength && list[i][0] != p; i++);  /*尋找第一項等於p的邊i*/

if(i == listlength)

queue[rear++] = list[i][1];   /*將邊i的第二項進隊*/

for(; i < listlength - 1; i++)        /*刪除邊i*/

list[i][0] = list[i + 1][0], list[i][1] = list[i + 1][1];

listlength--;

if(listlength == 0)

for(i = 0; i < listlength && list[i][1] != p; i++);   /*在表中查詢第二項等於p的邊i*/

if(i == listlength)

queue[rear++] = list[i][0];   /*將邊i的第一項進隊*/

for(; i < listlength - 1; i++)           /*刪除邊i*/

list[i][0] = list[i + 1][0], list[i][1] = list[i + 1][1];

listlength--;

}    /*7  跳到4*/

if(flag)

printf("yes\n");

else

printf("no\n");

}執行結果

2樓:我兒王騰大帝之資

我怎麼感覺你的例子應該輸出no呢

怎麼判斷是否是完全二叉樹 用c++或c語言

3樓:匿名使用者

你可以上網先找一個用佇列實現二叉樹的廣度優先搜尋的**,然後在**中增加一個標誌變數tag,初始化為0。然後找到**中訪問結點的那句**,在那句**處增加

if(tag==0)

判斷該結點是否有兩個孩子,如果沒有兩個孩子,則將tag=1else

判斷該結點是否為葉結點,如果不是葉結點,則不是完全二叉樹。

4樓:匿名使用者

廣度優先搜尋整個二叉樹,一旦找一個節點只不含有子節點或者子含有一個左子節點,那麼後續的所有節點都必須是葉子節點。否則,該樹就不是完全二叉樹。

實現的時候需要用到佇列。

下面是程式:

#include

#include

class treenode

~treenode()

if (right != null) }};

struct queuenode ;

//用連結串列的方式實現佇列

class queue

void enqueue(treenode *node) else

}//判斷佇列是否是空

bool isempty()

//出佇列

treenode * dequeue()

p->next = null;

delete p; //刪除佇列節點

return ptree;

}~queue()}};

/*判斷一個二叉樹是否是完全二叉樹

廣度優先搜尋整個二叉樹,一旦找一個節點只不含有子節點或者子含有一個左子節點,

那麼後續的所有節點都必須是葉子節點。否則,該樹就不是完全二叉樹。

*/ bool iscompbintree(treenode *root)

else if (p->left != null && p->right==null) else if (p->left == null && p->right!=null) else

} else }}

if (iscompbtree) else

return iscompbtree;}/*

1 1

2 3 2 3

4 5 4 5 6

*/void clear(treenode *ele, int n)

}int main()

printf("case 1: ");

root = ele[0];

root->left = ele[1]; root->right=ele[2];

root->left->left=ele[3]; root->left->right=ele[4];

iscompbintree(root);

printf("case 2: ");

clear(ele, 10);

root = ele[0];

root->left = ele[1]; root->right=ele[2];

root->left->right=ele[3]; root->right->left=ele[4]; root->right->right=ele[5];

iscompbintree(root);/*1

*/printf("case 3: ");

clear(ele, 10);

root = ele[0];

iscompbintree(root);/*1

23*/printf("case 4: ");

clear(ele, 10);

root = ele[0];

root->left = ele[1];

root->left->left = ele[2];

iscompbintree(root);/*1

2*/printf("case 5: ");

clear(ele, 10);

root = ele[0];

root->left = ele[1];

iscompbintree(root);/*1

2 3

4 5*/

printf("case 6: ");

clear(ele, 10);

root = ele[0];

root->left = ele[1]; root->right=ele[2];

root->right->left = ele[3]; root->right->right = ele[4];

iscompbintree(root);

clear(ele, 10);

for(int i=0; i<10; i++)

system("pause");

return 0;}

c語言判斷完全二叉樹

5樓:匿名使用者

lz完成了

#include "stdio.h"

#include "stdlib.h"

#define max 100

typedef struct node

bitnode,*bitree;

void createbitree(bitree * bt) }bool fullbitree(bitree b)void main()

6樓:匿名使用者

二叉樹儲存結構

struct bt

int check (struct bt *root)

7樓:匿名使用者

30分太少了,給我200分給你寫程式。

c語言判斷是否為完全二叉樹

8樓:哦仙人

如果是滿二叉樹不就找不到只有一個孩子的結點了嗎。。。。。。。。

好像排除掉這個就可以了,個人看法,我資料結構倒不很好。

9樓:凌雲紫冥

我覺得這個方法是可行的。 大方向沒錯,細節方面處理好就行。

10樓:匿名使用者

完全可以,但不知道你的實現複雜度。

資料結構,完全二叉樹問題(用c語言)

怎樣判斷一棵二叉樹為完全二叉樹是完全二叉樹不是滿二叉樹!(用c語言)

11樓:匿名使用者

滿二叉樹:深度為k,且有結點個數2的k次方減1

完全二叉樹:深度為k,有n個結點的二叉樹,當且僅當每一個結點都與

深度為k的滿二叉樹中編號從1到n的結點一一對應(最多一層不滿)

c語言怎麼判斷一顆二叉樹是否為完全二叉樹 思路是什麼

12樓:

按層次遍歷,先找出結點中左右孩子都沒有的第一個結點,然後判斷其後的結點是不是都沒有左右孩子,如果是則返回0,是完全二叉樹,否則不是完全二叉樹

13樓:盧居亮

1 先求 樹的深度h

2 再求 結點總數n

3 n應該在[2的h-1次冪-1,2的h次冪-1]之間 如果不再此區間 就不是完全二叉樹

c語言 什麼叫完全二叉樹?

14樓:匿名使用者

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

二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的(i-1)次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹t,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。 樹和二叉樹的2個主要差別:

1. 樹中結點的最大度數沒有限制,而二叉樹結點的最大度數為2; 2. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。

…… 樹是一種重要的非線性資料結構,直觀地看,它是資料元素(在樹中稱為結點)按分支關係組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程式時,可用樹表示源程式的語法結構。

又如在資料庫系統中,樹型結構也是資訊的重要組織形式之一。一切具有層次關係的問題都可用樹來描述。 謝謝採納

15樓:匿名使用者

完全二叉樹是一種特殊的二叉樹。

定義:如果一棵具有n個結點的深度為k的二叉樹,它的每一個結點都與深度為k的滿二叉樹中編號為1~n的結點一一對應,這棵二叉樹稱為完全二叉樹。

例:特點:

葉子結點只可能在最大的兩層上出現,對任意結點,若其右分支下的子孫最大層次為l,則其左分支下的子孫的最大層次必為l 或 l+1。

完全二叉樹第i層至多有2^(i-1)個節點,共i層的完全二叉樹最多有2^i-1個節點。

滿二叉樹:除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹。

設一棵完全二叉樹有結點,則該完全二叉樹的深度為,有葉子結點

256。二叉樹 binary tree 是指樹中節點的度不大於2的有序樹,它是一種最簡單且最重要的樹。二叉樹的遞迴定義為 二叉樹是一棵空樹,或者是一棵由一個根節點和兩棵互不相交的,分別稱作根的左子樹和右子樹組成的非空樹 左子樹和右子樹又同樣都是二叉樹 二叉樹 binary tree 是樹形結構的一個...

判斷一棵二叉樹是否為二叉排序樹C資料結構

struct node node l node r static bool isorderedbtree node n,int cmp func node node if isorderedbtree n l,cmp func if n r 0 if isorderedbtree n r,cmp f...

C語言中 二叉樹的順序儲存結構和二叉連結串列,三叉連結串列儲存結構各

鏈式結構優點bai都是便 du於定址,二叉連結串列缺點zhi結構性開銷隨著數dao據結構的回規模變大而答變大 尤其是葉子節點都有2個null,即損失2 sizeof elemtype 線性結構優點沒有結構性開銷,缺點個人感覺是插入和刪除不夠方便?試用場合估計取決問題規模大小,即空間複雜度和時間複雜度...