當前位置:首頁 » 編程語言 » c語言求二叉樹高度

c語言求二叉樹高度

發布時間: 2025-07-27 10:01:41

A. c語言 關於二叉樹的創建和遍歷(中序遍歷)

這個還是我學《數據結構》時做的有關二叉樹的練習呢,本來是全的,包括樹的初始化,建立,遍歷(中序、前序、後序和層次),還有輸出,復制,刪除節點,求深度,樹的刪除等等,看你只問了有關創建和中序遍歷的,所以選了一部分給你,供你參考吧!
#include <stdio.h>
#include <malloc.h>
#define MaxSize 10
#define Number 30
struct BiTNode{//定義數據結構
char data;
BiTNode *lchild,*rchild;
};
void InitBtree(BiTNode * &BT){//初始化二叉樹
BT=NULL;
}
void CreateBiTree(BiTNode *&BT,char *str){//建立二叉樹
BiTNode *s[MaxSize];//這里定義了一個數組用作堆棧方便檢查輸入和操作
int top=-1;
BT=NULL;
BiTNode *p=NULL;
int k, j=0;
char ch;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':
top++;
s[top]=p;
k=1;
break;
case ')':
top--;
break;
case ',':
k=2;
break;
default:
p=(struct BiTNode *) malloc(sizeof(struct BiTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(BT==NULL)
BT=p;
else{
if(k==1)
s[top]->lchild=p;
else
s[top]->rchild=p;
}
}
j++;
ch=str[j];
}
}
void inorder(BiTNode *BT){//中序遍歷二叉樹——遞歸形式
if(BT!=NULL){
inorder(BT->lchild );
printf("%c ",BT->data);
inorder(BT->rchild );
}
}

void main(){
BiTNode *BT;
printf("以廣義表形式表示輸入的二叉數 (如A(B(C,D),E(,F))的形式)\n\n");
char string[Number]="A(B(,C),D(E(F),G(,H)))";
//如果想要自己輸入,可以將下邊的注釋去掉,然後自己按照廣義表形式輸入,
//(如上例的形式)此處為了方便查看,用了默認的數值
//這里之所以用此種形式(廣義表形式輸入)是為了保證輸入的數組成的二叉樹完全符合你所定義的樹的形狀
/*char string[Number],ch;
int i=0;
ch=getchar();
while(ch!='\n' && i<Number){
string[i]=ch;
i++;
ch=getchar();
}
string[i]='\0';
*/

InitBtree(BT);//初始化二叉樹
CreateBiTree(BT,string);//創建二叉樹
printf("\n中序遍歷二叉樹順序為: ");
inorder(BT);//中序遍歷二叉樹
printf("\n");
}
程序不復雜,所以只是加了必要和最簡單的注釋,相信你看看應該完全可以理解的,祝你進步!

B. 數據結構二叉樹的基本操作~~~~

用遞歸的方法實現以下演算法
1.以二叉鏈表表示二叉樹,建立一棵二叉樹;
2.輸出二叉樹的前序遍歷結果;
3.輸出二叉樹的猛猛備中序遍歷結果;
4.輸出二叉樹的後序遍歷結果;
5.統計二叉樹的葉結點個數;
6.統計二叉樹的結點個數;
7.計算二叉樹的深度。
8.交換二叉樹每個結點的左孩子和右孩子;
#include <malloc.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

#define OK 1
#define NULL 0
#define FALSE 0

typedef struct BiTNode{ //定義鏈式二叉樹結構體
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree T;
char ch;
int flag=0;

int createBiTree(BiTree &T){
//按先序輸入二叉樹中知裂結點的值(一個字元),空格表示空樹
ch=getchar();
if(ch==' ')T=NULL; //表示空樹
else if(ch==10)flag=1; //結點信息輸入錯誤則返回0
else {
T=(BiTNode*)malloc(sizeof(BiTree));
if(!T)exit(1);//空間分配不成功則退出
T->data=ch; //生成根結點
createBiTree(T->lchild); //生成左子樹
createBiTree(T->rchild); //生成右子樹
}//else
return OK;
}//createBiTree

int PreOrderTraverse(BiTree T){ //先序遍歷二叉樹的遞歸演算法
if(T){
printf("%c",T->data); //訪問根結點
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}//if
return OK;
}

int InOrderTraverse(BiTree T){ //中序
if(T){
InOrderTraverse(T->lchild);
printf("%c",T->data); //訪問根結點
InOrderTraverse(T->rchild);
}//if
return OK;
}

int PostOrderTraverse(BiTree T){ // 後序
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c",T->data); //訪問根結點
}
return OK;
}

int NodeCount(BiTree T){ //
if(T==NULL) return 0;// 如果是空樹,則結點個數為0
else return 1+NodeCount(T->lchild)+NodeCount(T->rchild);
//否則結點個數為1+左子樹的結點個數+右子樹的結點個數
}

int LeafNodeCount(BiTree T ){
if(!T)return 0; //如果是空樹,則葉子個數為枝毀0;
else if(LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild)==0)return 1;//如果是葉子結點,則葉子結點個數為1
else return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);
//否則葉結點個數為左子樹的葉結點個數+右子樹的葉結點個數
}

int Depth(BiTree T){//計算二叉樹的深度
int m,n;
if(T==NULL )return 0;//如果是空樹,則深度為0
else {
m=Depth(T->lchild);//計算左子樹的深度記為m
n=Depth(T->rchild);//計算右左子樹的深度記為n
if(m>n) return(m+1);//二叉樹的深度為m 與n的較大者加1
else return (n+1);
}
}
void Exchange1(BiTree T)
{
BiTree temp;
if(T)
{
Exchange1(T->lchild);
Exchange1(T->rchild);
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
}

void main(){
int no,out=1;
char choose;
//*****************************主界面**********************************
while(out){
system("cls");
printf("\n這是實驗2的程序,請按照說明使用:\n");
printf("1.以二叉鏈表表示二叉樹,建立一棵二叉樹,請輸入1");
printf("\n2.輸出二叉樹的前序遍歷結果,請輸入2");
printf("\n3.輸出二叉樹的中序遍歷結果,請輸入3");
printf("\n4.輸出二叉樹的後序遍歷結果請輸入4");
printf("\n5.統計二叉樹的結點個數,請輸入5");
printf("\n6.統計二叉樹的葉結點個數,請輸入6");
printf("\n7.計算二叉樹的深度,請輸入7");
printf("\n8. 交換二叉樹的左右孩子,請輸入8");
printf("\n9.退出,請輸入其他\n");
//********************處理輸入的選項************************************
choose=getch();
switch(choose){
case '1':
system("cls");
printf("\n請輸入二叉鏈表各結點信息建立二叉樹,空樹用空格表示:\n");
if(createBiTree(T)==0||flag==1){ //結點輸入錯誤!
printf("輸入錯誤,請重新輸入結點信息!\n");
getch();break;}
else
printf("輸入完畢!");//成功建立二叉鏈表
getch();break;
case '2':
printf("\n先序遍歷的結果是:");
PreOrderTraverse(T);
getch();break;
case '3':
printf("\n中序遍歷的結果是:");
InOrderTraverse(T);
getch();break;
case '4':
printf("\n後序遍歷的結果是:");
PostOrderTraverse(T);
getch();break;
case '5':
no=NodeCount(T);
printf("\n總結點個數為:%d\n",no);
getch();break;
case '6':
printf("\n葉子結點的個數為:%d\n",LeafNodeCount(T));
getch();break;
case '7':
printf("\n二叉樹深度為:%d\n",Depth(T));
getch();break;
case '8':
printf("\n交換後的結果為:");
Exchange1(T);
PostOrderTraverse(T);
getch();break;
default :
printf("\n你輸入的是:其他\n");
getch();
out=0;
} //end switch
}//end of while
system("cls");
printf("\n\n\t\t歡迎使用,再見!");
}

碉堡了!

C. 求二叉樹高度的原理、演算法是什麼,越詳細越好,C語言,謝謝

首先分析二叉樹的深度(高度)和它的左、右子樹深度之間的關系。從二叉樹深度的定義可知,二叉樹的深度應為其左、右子樹深度的最大值加1。由此,需先分別求得左、右子樹的深度,演算法中「訪問結點」的操作為:求得左、右子樹深度的最大值,然後加
1

int
Depth
(BiTree
T
){
//
返回二叉樹的深度
if
(
!T
)
depthval
=
0;
else
{
depthLeft
=
Depth(
T->lchild
);
depthRight=
Depth(
T->rchild
);
depthval
=
1
+
(depthLeft
>
depthRight
?
depthLeft
:
depthRight);
}
return
depthval;
}

D. C語言 什麼叫完全二叉樹

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

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

例:

特點:

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

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

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

E. c璇璦錛屼簩鍙夋爲奼傝В鍀

鍏堣冭檻搴︿負2鐨勭粨鐐癸紝絎涓灞1涓錛岀浜屽眰2涓錛岀涓夊眰4涓錛岀鍥涘眰8涓錛岀浜斿眰8涓錛屽叡23涓銆
鐒跺悗絎5灞傝繕鏈8涓絀轟綅錛屽厛鍋囪句負鍙跺瓙鑺傜偣錛屽嵆搴︿負0銆傜浜斿眰婊★紝鐩鍓嶆誨叡31涓緇撶偣銆
鐒跺悗絎浜斿眰鐨8涓搴︿負2鐨勭粨鐐瑰彲浠ュ紩鐢沖嚭16涓鍙跺瓙緇撶偣錛屾誨叡47涓錛屼互婊¤凍棰樻剰錛屽亣璁炬垚絝嬨
鏁6灞傘
褰撶劧姣旇緝綆鍗曠殑棰樼敾鍥句細寰堝ソ瑙c

熱點內容
安卓客戶端在哪裡面打開 發布:2025-07-27 15:57:28 瀏覽:613
電腦做共享伺服器遠程訪問 發布:2025-07-27 15:56:06 瀏覽:472
apktool回編譯路徑不存在 發布:2025-07-27 15:56:00 瀏覽:56
西門子200plc編程 發布:2025-07-27 15:55:58 瀏覽:234
安卓手機抖音升級功能在哪裡 發布:2025-07-27 15:41:05 瀏覽:988
c編程題網站 發布:2025-07-27 15:31:19 瀏覽:814
ios用什麼解壓軟體 發布:2025-07-27 15:29:01 瀏覽:890
如何下載清風伺服器 發布:2025-07-27 15:28:59 瀏覽:17
internet訪問沒網 發布:2025-07-27 15:24:11 瀏覽:252
線性搜索演算法 發布:2025-07-27 14:53:21 瀏覽:857