1. 編寫演算法,判斷一顆二叉樹是否是完全二叉樹
#include <stdio.h>#include <stdlib.h>#define Max 100 typedef struct Node { char data; struct Node * LChild,*RChild;}BiTNode,*BiTree; void CreateBiTree(BiTree * bt) { char ch; ch=getchar(); if(ch==10)ch=getchar();//如果為 回車換行 讀取下一個字元 if(ch=='.') *bt=NULL; //如果為 . 代表此節點為空 else { * bt=(BiTree)malloc(sizeof(BiTNode)); (* bt)->data=ch; //賦值 CreateBiTree(&((* bt)->LChild)); CreateBiTree(&((* bt)->RChild)); } } bool fullBiTree(BiTree b) { if(b->LChild==NULL && b->RChild==NULL)return true;// 如果左右子樹為空,返回真 if(b->LChild==NULL || b->RChild==NULL)return false;// 如果左右子樹只有一個為空,返回假 return fullBiTree(b->LChild) && fullBiTree(b->RChild);// 通過遞歸,返回 } void main(){ printf("請依次輸入字元\n"); BiTree b; CreateBiTree(&b); //創建二叉樹 bool cm=fullBiTree(b); if(cm)printf("´此二叉樹為完全二叉樹\n"); else printf("´此二叉樹不是完全二叉樹\n"); }2. 判斷一棵二叉樹是否為完全二叉樹演算法
#include "stdafx.h"
#include "iostream"
#define Max 100
using namespace std;
typedef struct Node
{ char data;
struct Node * LChild,*RChild;}BiTNode,*BiTree;
void CreateBiTree(BiTree * bt)
{
char ch;
ch=getchar();
if(ch=='.') *bt=NULL;
else
{
* bt=(BiTree)malloc(sizeof(BiTNode));
(* bt)->data=ch;
CreateBiTree(&((* bt)->LChild));
CreateBiTree(&((* bt)->RChild));
}
}
int fullBiTree(BiTree b)
{ //complete binary tree:完全二叉樹
//full:滿
BiTree queue[Max],p;
int first=0,rear=0,bj=1,cm=1;
if(b!=NULL)
{
rear++;
queue[rear]=b;
while(first!=rear)
{
first++;
p=queue[first];
if(p->LChild==NULL)
{
bj=0;
if(p->RChild!=NULL) cm=0;
}
else
{
cm=bj;
rear++;queue[rear]=p->LChild;
if(p->RChild==NULL) bj=0;
else
{
rear++;
queue[rear]=p->RChild;
}
}
}
return cm;
}
return 1;
}
int main(int argc, char* argv[])
{
cout<<"請依次輸入字元ABCO..UMJKL.EDC....."<<endl;
BiTree b;
CreateBiTree(&b);
int cm=fullBiTree(b);
if(cm)cout<<"此二叉樹為完全二叉樹"<<endl;
else cout<<"此二叉樹不是完全二叉樹"<<endl;
return 0;
}
3. 怎麼判斷是否是完全二叉樹 用C++或C語言
你可以上網先找一個用隊列實現二叉樹的廣度優先搜索的代碼,然後在代碼中增加一個標志變數tag,初始化為0。然後找到代碼中訪問結點的那句代碼,在那句代碼處增加
if(tag==0)
判斷該結點是否有兩個孩子,如果沒有兩個孩子,則將tag=1
else
判斷該結點是否為葉結點,如果不是葉結點,則不是完全二叉樹。
4. 用c++ 完成以下演算法:判別一棵樹是否為二叉樹!
這里可以用遞歸
不過不知道你的樹是哪種方式定義的具體代碼就不寫了,大體過程如下
if 結點有三個以上的結點 則返回不是,函數退出
if 第一個子結點不為空 判斷該子結點是否為二叉樹(也就是調用遞歸函數)
if 第二個子結點不為空 判斷該子結點是否為二叉樹(也就是調用遞歸函數)
還要加入一些必要的東西,乖下的你自己看看吧
5. 用c語言版數據結構的演算法實現判斷一棵二叉樹是否為完全二叉樹的演算法
遍歷一下算出這棵樹的深度k,然後用公式看看深度和點數之間是否具有點數n=2^k-1的關系,具有就是完全二叉樹,否則不是。
6. 演算法:判斷一棵樹是否是平衡二叉樹
判斷一顆數是否是平衡二叉樹。
平衡二叉樹。左孩子節點,總是小於父節點,右孩子節點總是大於父節點。
對於每一個節點都符合這樣的特性。
不是很麻煩,對於平衡二叉樹來說,它的中序遍歷必定是一個升序序列。
直接中序遍歷,如果出現後面的節點小於前面必定不是平衡二叉樹
這里保存的是上一個節點,如果只保存上一個值,需要考慮int值上下界限。有可能輸入Integer.MAX_VALUE的這種情況
7. 假設二叉樹用二叉鏈表表示;設計一演算法,判別該二叉樹是否為完全二叉樹。(求完整源代碼)如題 謝謝了
一定要完整源碼?如果沒有人給的話,建議你還是看一下我說的:就是一個二叉樹的遍歷。1.只要在遍歷的時候,發現當前深度大於log2(n)+1,就可以判斷不是。2.有一個變數,cnt初始化為n個節點的完全二叉樹最後一層節點的數目,計算方法:n - (2^k - 1)然後,只要不是後序遍歷,每次遍歷到深度為floor(log2(n))時,如果cnt不為0,而且兒子是空節點,則判斷不是,否則cnt--。遍歷完後,如果一直沒有判斷成不是,則一定是。
8. 編寫一演算法,判別給定的二叉樹是否是完全二叉樹。二叉樹用二叉鏈表儲存結構儲存
#include <stdio.h>#define MaxNum 10000BinTree buildTree(elementype BT[],int i , int n){ BinTree r;if(i>n)return(NULL);r=(BinTree)malloc(sizeof(BinNode));r->data=BT[i];r->Lchild=buildTree(BT,2*i,n);r->Rchild=buildTree(BT,2*i+1,n);return(r);}Int checkTree(BinTree t){ int maxn0=0;n=num(t,1,&maxn0);if(n==maxn0)return(1); else return(0); }int num(BinTree t,int i,int *m){ if(t==NULL) return(0); if(*m<i)*m=i;return(1+num(t->Lchild,2*i,m)+num(t->Rchild,2*i+1,m));}main( ){ int data,int t,int i,int *m; printf("input data:\n") scanf("%d,&data");if(t==NULL)printf("F\n")if(*m<i)*m=i;printf("T\n")}
9. 請編寫一個判別給定二叉樹是否為二叉排序樹的演算法
1、首先打開VC++6.0。
7、運行得到結果。