#include
創(chuàng)新互聯(lián)公司主要業(yè)務(wù)有網(wǎng)站營銷策劃、成都網(wǎng)站設(shè)計、網(wǎng)站制作、微信公眾號開發(fā)、成都小程序開發(fā)、H5網(wǎng)站設(shè)計、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當(dāng)客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、成都全網(wǎng)營銷資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。
#include
using namespace std;
#define MAXSIZE 100
typedef struct BiNode
{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
void Create(BiTree T)//用先序遍歷的順序建立二叉鏈表(遞歸方法)
{
char ch;
cinch;
if(ch=='#')
T=NULL;
else
{
T=new BiNode;
T-data=ch;
Create(T-lchild);
Create(T-rchild);
}
}
void PreOrder(BiTree T)//先序遍歷二叉樹(遞歸)
{
if(T)
{
coutdata" ";
PreOrder(T-lchild);
PreOrder(T-rchild);
}
}
void InOrder(BiTree T)//中序遍歷二叉樹(遞歸)
{
if(T)
{
InOrder(T-lchild);
coutdata" ";
InOrder(T-rchild);
}
}
void PostOrder(BiTree T)//后序遍歷二叉樹(遞歸)
{
if(T)
{
PostOrder(T-lchild);
PostOrder(T-rchild);
coutdata" ";
}
}
望采納~~~
在二叉樹中有一種平衡二叉樹,通過平衡算法可以讓二叉樹兩邊的節(jié)點平均分布,這樣就能讓所有的索引查找都在一個近似的時間內(nèi)完成。而MySQL這類數(shù)據(jù)庫采用了二叉樹的升級版B+Tree的形式,每個節(jié)點有三個支葉,不過其算法原理仍然是平衡樹的原理。
//這個題目挺有意思的,很喜歡,你看看我這個咋樣啊?
#includestdio.h
#includemalloc.h
typedef
char
elemtype
;
typedef
struct
node
{
elemtype
data
;
struct
node
*lchild
;
struct
node
*rchild
;
}btree,*pbtree
;
//先序創(chuàng)建樹
void
createbtree(pbtree
*t)
//此處參數(shù)應(yīng)該用指針的指針,應(yīng)給它要改變指向二叉樹根的那個指針
{
char
ch
;
ch=getchar();
getchar();
//得到回車按那個字符
if(ch
=='
')
//輸入空字符時要打空格
{
(*t)
=
null
;
return
;
}
else
{
if(
!(
(*t)
=
(pbtree)
malloc(sizeof(btree))
)
)
return
;
(*t)-data
=
ch
;
createbtree(
(*t)-lchild
);
createbtree(
(*t)-rchild
);
}
}
void
btreeprint(btree
*tr,int
n)
//逆時針旋轉(zhuǎn)90°打印二叉樹,n為縮進(jìn)層數(shù),初始值為0
{
int
i;
if(tr
==
null)
return;
btreeprint(tr-rchild,n+1);
for(i
=
0;in;i++)
printf("
");
if(n
=
0)
{
printf("--");
printf("%c\n",tr-data);
}
btreeprint(tr-lchild,n+1);
}
void
main()
{
pbtree
btree
;
createbtree(btree);
btreeprint(btree,0);
}
輸入舉例:建立以a為根b、c分別為左右子樹的二叉樹!輸入格式為:
a
回車!
b
回車!
空格
回車!
空格
回車!
c
回車!
空格
回車!
空格
回車!
先序遞歸創(chuàng)建二叉樹,并對其進(jìn)行 先序、中序、后序遍歷
#includemalloc.h // malloc()等
#includestdio.h // 標(biāo)準(zhǔn)輸入輸出頭文件,包括EOF(=^Z或F6),NULL等
#includestdlib.h // atoi(),exit()
#includemath.h // 數(shù)學(xué)函數(shù)頭文件,包括floor(),ceil(),abs()等
#define ClearBiTree DestroyBiTree // 清空二叉樹和銷毀二叉樹的操作一樣
typedef struct BiTNode
{
int data; // 結(jié)點的值
BiTNode *lchild,*rchild; // 左右孩子指針
}BiTNode,*BiTree;
int Nil=0; // 設(shè)整型以0為空
void visit(int e)
{ printf("%d ",e); // 以整型格式輸出
}
void InitBiTree(BiTree T)
{ // 操作結(jié)果:構(gòu)造空二叉樹T
T=NULL;
}
void CreateBiTree(BiTree T)
{ // 算法6.4:按先序次序輸入二叉樹中結(jié)點的值(可為字符型或整型,在主程中定義),
// 構(gòu)造二叉鏈表表示的二叉樹T。變量Nil表示空(子)樹。修改
int number;
scanf("%d",number); // 輸入結(jié)點的值
if(number==Nil) // 結(jié)點的值為空
T=NULL;
else // 結(jié)點的值不為空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根結(jié)點
if(!T)
exit(OVERFLOW);
T-data=number; // 將值賦給T所指結(jié)點
CreateBiTree(T-lchild); // 遞歸構(gòu)造左子樹
CreateBiTree(T-rchild); // 遞歸構(gòu)造右子樹
}
}
void DestroyBiTree(BiTree T)
{ // 初始條件:二叉樹T存在。操作結(jié)果:銷毀二叉樹T
if(T) // 非空樹
{ DestroyBiTree(T-lchild); // 遞歸銷毀左子樹,如無左子樹,則不執(zhí)行任何操作
DestroyBiTree(T-rchild); // 遞歸銷毀右子樹,如無右子樹,則不執(zhí)行任何操作
free(T); // 釋放根結(jié)點
T=NULL; // 空指針賦0
}
}
void PreOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始條件:二叉樹T存在,Visit是對結(jié)點操作的應(yīng)用函數(shù)。修改算法6.1
// 操作結(jié)果:先序遞歸遍歷T,對每個結(jié)點調(diào)用函數(shù)Visit一次且僅一次
if(T) // T不空
{ Visit(T-data); // 先訪問根結(jié)點
PreOrderTraverse(T-lchild,Visit); // 再先序遍歷左子樹
PreOrderTraverse(T-rchild,Visit); // 最后先序遍歷右子樹
}
}
void InOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始條件:二叉樹T存在,Visit是對結(jié)點操作的應(yīng)用函數(shù)
// 操作結(jié)果:中序遞歸遍歷T,對每個結(jié)點調(diào)用函數(shù)Visit一次且僅一次
if(T)
{ InOrderTraverse(T-lchild,Visit); // 先中序遍歷左子樹
Visit(T-data); // 再訪問根結(jié)點
InOrderTraverse(T-rchild,Visit); // 最后中序遍歷右子樹
}
}
void PostOrderTraverse(BiTree T,void(*Visit)(int))
{ // 初始條件:二叉樹T存在,Visit是對結(jié)點操作的應(yīng)用函數(shù)
// 操作結(jié)果:后序遞歸遍歷T,對每個結(jié)點調(diào)用函數(shù)Visit一次且僅一次
if(T) // T不空
{ PostOrderTraverse(T-lchild,Visit); // 先后序遍歷左子樹
PostOrderTraverse(T-rchild,Visit); // 再后序遍歷右子樹
Visit(T-data); // 最后訪問根結(jié)點
}
}
void main()
{
BiTree T;
InitBiTree(T); // 初始化二叉樹T
printf("按先序次序輸入二叉樹中結(jié)點的值,輸入0表示節(jié)點為空,輸入范例:1 2 0 0 3 0 0\n");
CreateBiTree(T); // 建立二叉樹T
printf("先序遞歸遍歷二叉樹:\n");
PreOrderTraverse(T,visit); // 先序遞歸遍歷二叉樹T
printf("\n中序遞歸遍歷二叉樹:\n");
InOrderTraverse(T,visit); // 中序遞歸遍歷二叉樹T
printf("\n后序遞歸遍歷二叉樹:\n");
PostOrderTraverse(T,visit); // 后序遞歸遍歷二叉樹T
}
樓主你好
具體代碼如下:
#includestdio.h
#includestdlib.h
#define MAX 40
typedef struct node//二叉樹結(jié)點定義
{
char data;
struct node *lChild;//左孩子
struct node *rChild;//右孩子
}BTNode;
//*************************************二叉樹操作***************************************
void Initial_BT(BTNode * b)
{
b=NULL;
}
void Creat_BT(BTNode * b)//創(chuàng)建二叉樹
{
BTNode *St[MAX];//用棧輔助實現(xiàn)二叉樹的建立
BTNode *p=NULL;
b=NULL;
int top=-1;//棧指針
int k;//k為左右孩子標(biāo)示(1為左孩子、2為右孩子)
char ch;
printf("Enter the binary tree:\n");
ch=getchar();
while(ch!='\n')
{
switch(ch)
{
case '('://左孩子
top++;
St[top]=p;
k=1;
break;
case ')':
top--;
break;
case ','://右孩子
k=2;
break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p-data=ch;
p-lChild=p-rChild=NULL;
if(!b)//如果為根節(jié)點
b=p;
else
{
switch(k)
{
case 1:
St[top]-lChild=p;
break;
case 2:
St[top]-rChild=p;
break;
}
}
}
ch=getchar();//繼續(xù)讀入數(shù)據(jù)
}
}
void InOrder(BTNode *b)//中序遍歷
{
if(b)
{
InOrder(b-lChild);
printf("%c",b-data);
InOrder(b-rChild);
}
}
void PostOrder(BTNode *b)//后序遍歷
{
if(b)
{
PostOrder(b-lChild);
PostOrder(b-rChild);
printf("%c",b-data);
}
}
int Leaf_Sum(BTNode *b)
{
if(!b)
return 0;
else if(b-lChild == NULL b-rChild == NULL)
return 1;
else
return Leaf_Sum(b-lChild)+Leaf_Sum(b-rChild);
}
void Start()
{
BTNode *b;//二叉樹
char choice;
b=(BTNode *)malloc(sizeof(BTNode));
Initial_BT(b);
GOTO:system("cls");
printf("\t\t1.創(chuàng)建二叉樹.\n"
"\t\t2.中序遍歷.\n"
"\t\t3.后序遍歷.\n"
"\t\t4.葉子結(jié)點個數(shù).\n"
"\t\t5.退出.\n");
printf("輸入你的選擇:");
GOTO1:choice=getchar();
switch(choice)
{
case '1':
getchar();
Creat_BT(b);
system("pause");
goto GOTO;
case '2':
InOrder(b);
printf("\n");
system("pause");
getchar();
goto GOTO;
case '3':
PostOrder(b);
printf("\n");
system("pause");
getchar();
goto GOTO;
case '4':
printf("共有%d個葉子結(jié)點\n",Leaf_Sum(b));
system("pause");
getchar();
goto GOTO;
case '5':
system("pause");
break;
default:
printf("輸入錯誤!\n"
"重新輸入:");
goto GOTO1;
}
}
int main()
{
Start();
return 0;
}
希望能幫助你哈