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

c語言完全二叉樹的判斷

發布時間: 2022-02-18 07:28:34

c語言 什麼叫完全二叉樹

在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查找樹和二叉堆。二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的(i-1)次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。 樹和二叉樹的2個主要差別: 1. 樹中結點的最大度數沒有限制,而二叉樹結點的最大度數為2; 2. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。…… 樹是一種重要的非線性數據結構,直觀地看,它是數據元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。樹在計算機領域中也得到廣泛應用,如在編譯源程序時,可用樹表示源程序的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。 謝謝採納

❷ 判斷完全二叉樹用C語言編寫

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

1初始化空表、空隊;

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

3根結點進隊;

4將隊首出隊到p;

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

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

7跳到4。

補充提供一個相應的程序代碼如下,你可以試試

#include <stdio.h>
#define N 1024

void main( )
{
short list[N][2], queue[N], listLength = 0, front = 0, rear = 0, r, n, i, p;/*1 初始化空表,空隊*/
char flag; /*flag是判斷結果標識*/
scanf("%d%d", &n, &r); /*2 輸入結點數、指定根結點,輸入邊到表中*/
for(i = 0; i < n - 1; i++)
scanf("%d%d", &list[i][0], &list[i][1]);
listLength = n - 1;
queue[rear++] = r;/*3 根結點進隊*/
while(1) {
p = queue[front++];/*4 將隊首出隊到p*/
if(listLength == 0) { /*5 如果表為空,則返回1(真)*/
flag = 1;
break;
}
for(i = 0; i < listLength && list[i][0] != p; i++); /*尋找第一項等於p的邊i*/
if(i == listLength) {/*如果沒有找到,返回0(假)*/
flag = 0;
break;
}
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) { /*6 若表為空,返回1(真)*/
flag = 1;
break;
}
for(i = 0; i < listLength && list[i][1] != p; i++);/*在表中查找第二項等於p的邊i*/
if(i == listLength) { /*如果沒有找到,返回0(假)*/
flag = 0;
break;
}
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 ");
else
printf("no ");
}

運行結果

❸ 判斷是否為完全二叉樹

建立二叉樹有點復雜,可以找書看看,一般數據結構的書上是會有的吧。
判斷是否完全二叉樹的代碼如下(直接根據完全二叉樹定義編寫的):

//假設之前定義的二叉樹的節點類型為struct BT_Node。
/*下面的函數判斷子樹sub_root是否為完全二叉樹,是則返回true,否則返回false.同時,將子樹的高度通過pHight返回。這是一個輔助函數。
*/
bool __IsBalanced(BT_Node* sub_root,int *pHight)
{
int lHight,rHight;//左、右子樹的高度。
bool result1,result2;
if(sub_root == NULL){
*pHight = 0;
return true;
}
result1 = __IsBalanced(sub_root->lChild,&lHight);
result2 = __IsBalanced(sub_root->rChild,&rHight);
*pHight = 1 + (lHight>rHight? lHight: rHight);
if(result1 && result2 && lHight == rHight)
return ture;
else
return false;
}
///下面的函數判斷二叉樹root是否完全二叉樹。
bool IsBalanced(BT_Node* root)
{
int hight;
return __IsBalanced(root,&hight);
}

❹ 數據結構,完全二叉樹問題(用C語言)

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

typedef struct node
{
int elem;
struct node *lch,*rch;
}Bnode;

Bnode *creat()
{
Bnode *root =NULL;
Bnode *s[20];
int i,x;
int j;
printf("input i and x:");
scanf("%d,%d",&i,&x);
while(i != 0)
{
Bnode *p = (Bnode *)malloc(sizeof(Bnode));
p->elem = x;
p->lch = NULL;
p->rch = NULL;
s[i] = p;
if(i == 1)root=p;
else
{
j = i/2;
if(i%2 == 0) //編號為偶數
s[j]->lch = p;
else
s[j]->rch = p;

}
printf("input i and x:");
scanf("%d,%d",&i,&x);
}
return root;
}
void anceng(Bnode *p) //按層遍歷
{
Bnode *q = p;
Bnode *s[20];
int front = 0;
int rear = 0;
if(q != NULL)
{
rear++;
s[rear] = q;
}
while(rear != front)
{
front++;
p = s[front];
printf("%d\n",p->elem);
if(p->lch != NULL)
{
rear++;
s[rear] = p->lch;
}
if(p->rch != NULL)
{
rear++;
s[rear] = p->rch;
}
}
}

void zhonggen(Bnode *p) //非遞歸中根遍歷
{
Bnode *q = p;
Bnode *s[20];
int top = 0;
int flag = 1;
do
{
while(q != NULL)
{
top++;
s[top] = q;
q = q->lch;
}
if(top == 0)flag = 0;
else
{
q = s[top];
top--;
printf("%d\n",q->elem);
q = q->rch;
}
}
while(flag);
}

void postorder(Bnode *p) //遞歸後根遍歷
{
if(p!= NULL)
{
postorder(p->lch);
postorder(p->rch);
printf("%d\n",p->elem);
}
}
void inorder(Bnode *p) //遞歸中根遍歷
{
if(p!= NULL)
{
inorder(p->lch);
printf("%d\n",p->elem);
inorder(p->rch);
}
}
void preorder(Bnode *p) //遞歸先根遍歷
{
if(p!= NULL)
{
printf("%d\n",p->elem);
preorder(p->lch);
preorder(p->rch);
}
}
int main(void)
{
int tmp;
int i = 0;
int choice;
Bnode *root;
do
{
printf("\n");
printf("1.creat\n");
printf("2.先序遍歷\n");
printf("3.中序遍歷\n");
printf("4.後序遍歷\n");
printf("5.中根遍歷\n");
printf("6.按層遍歷\n");
printf("0.exit\n");
printf("input your choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:
root = creat();
break;
case 2:
preorder(root);
break;
case 3:
inorder(root);
break;
case 4:
postorder(root);
break;
case 5:
zhonggen(root);
break;
case 6:
anceng(root);
break;
case 0:
break;
}

}while(choice);
return 0;
}

此代碼有創建和遍歷的各種演算法,遍歷有按層遍歷,各種遞歸遍歷和非遞歸遍歷。希望對樓主有幫助。
望採納!!

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

如果是滿二叉樹不就找不到只有一個孩子的結點了嗎。。。。。。。。
好像排除掉這個就可以了,個人看法,我數據結構倒不很好。

❻ 數據結構 c語言 判斷一棵二叉樹是完全二叉樹的函數

課本上的概念說得比較難懂,用比較通俗的話說就是:除了最底層外,其他各層都是滿的,而且最底層是從右往左連續缺若干個結點。就是說你在最後一層從左往右看時不會是在中間突然少了個結點,一旦缺一個結點,這一層在它右邊的就全空了。

❼ 數據結構演算法,用C語言,判斷一個二叉樹是不是完全二叉樹,求大神....不要文字描述的,要代碼

數據結構的書上有……以前我學《數據結構》的時候課本上就有

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

滿二叉樹:深度為K,且有結點個數2的K次方減1
完全二叉樹:深度為K,有N個結點的二叉樹,當且僅當每一個結點都與
深度為K的滿二叉樹中編號從1到N的結點一一對應(最多一層不滿)

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

你可以上網先找一個用隊列實現二叉樹的廣度優先搜索的代碼,然後在代碼中增加一個標志變數tag,初始化為0。然後找到代碼中訪問結點的那句代碼,在那句代碼處增加
if(tag==0)
判斷該結點是否有兩個孩子,如果沒有兩個孩子,則將tag=1
else
判斷該結點是否為葉結點,如果不是葉結點,則不是完全二叉樹。