源程序:
//
// main.cpp
// bitree
//
// Created by duanqibo on 2019/11/25.
// Copyright © 2019年 duanqibo. All rights reserved.
//
#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct binode
{
char data;
struct binode *lchild,*rchild;
}BinTree;
BinTree *creatbitree()
{
BinTree *T;
char ch;
T=(BinTree *)malloc(sizeof(BinTree));
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T->data=ch;
T->lchild=creatbitree();
T->rchild=creatbitree();
}
return T;
}
//遞歸的先序遍歷二叉樹
void preordertraverse(BinTree *T)
{
if(T)
{
cout<<T->data<<" ";//輸出根結點
preordertraverse(T->lchild);
preordertraverse(T->rchild);
}
}
//遞歸的中序遍歷二叉樹
void inordertraverse(BinTree *T)
{
if(T)
{
inordertraverse(T->lchild);
cout<<T->data<<" ";//輸出根結點
inordertraverse(T->rchild);
}
}
//遞歸的后序遍歷二叉樹
void postordertraverse(BinTree *T)
{
if(T)
{
postordertraverse(T->lchild);
postordertraverse(T->rchild);
cout<<T->data<<" ";//輸出根結點
}
}
//求二叉樹的深度
int depthofbitree(BinTree *T)
{
int ldepth;
int rdepth;
if(T==NULL) //空樹
{
return 0;
}
ldepth=depthofbitree(T->lchild);
rdepth=depthofbitree(T->rchild);
if(ldepth>rdepth)
return ldepth+1;
else
return rdepth+1;
}
//求二叉樹的葉子結點
int leafcount(BinTree *T)
{
if(T==NULL)
{
return 0;
}
else if(T->lchild==NULL && T->rchild==NULL)
{
return 1;
}
else
{
int n=leafcount(T->lchild);//求左子樹葉子的數目
int m=leafcount(T->rchild);//求右子樹葉子的數目
return n+m;
}
}
//求二叉樹T中度為1的結點的數量
int onesoncount(BinTree *T)
{
if(T==NULL)
{
return 0;
}
else if((T->lchild==NULL && T->rchild!=NULL) ||(T->lchild!=NULL && T->rchild==NULL))
{
cout<<"度為1的結點的字母為:"<<T->data<<endl;
return (onesoncount(T->lchild) +onesoncount(T->rchild) +1);
}
else
{
return (onesoncount(T->lchild) +onesoncount(T->rchild));
}
}
//求非葉子結點的數目
int notleafcount(BinTree *T)
{
if(T==NULL)
{
return 0;
}
else if(T->lchild == NULL && T->rchild == NULL)
return 0;
else
{
cout<<T->data; //輸出非終端結點的值
int n=notleafcount(T->lchild); //左子樹非終端結點的數目
int m=notleafcount(T->rchild); //右子樹非終端結點的數目
return (m+n+1);
}
}
//求二叉樹的全部結點數目
int node_num(BinTree *T)
{
if(T==NULL)
return 0;
else
return node_num(T->lchild)+node_num(T->rchild)+1;
}
int main()
{
// insert code here...
BinTree *t;
printf("請按以下兩種序列輸入二叉樹的結點:\n");
printf("AB#D##CE### 或 ABD##E##C#F##\n");
t=creatbitree();
cout<<"先序遍歷:";
preordertraverse(t);
cout<<endl;
cout<<"中序遍歷:";
inordertraverse(t);
cout<<endl;
cout<<"后序遍歷:";
postordertraverse(t);
cout<<endl;
cout<<"二叉樹的深度為:"<<depthofbitree(t)<<endl;
int leaf=0; //葉子結點數目,初始化為0
leaf=leafcount(t);
cout<<"葉子結點數為:"<<leaf<<endl;
int oneson=0; //度為1的結點數目
oneson=onesoncount(t);
cout<<"度為1的結點的數量為:"<<oneson<<endl;
int notleafcount_=0; //非葉子結點的數目,初始化為0
cout<<"非葉子結點為:";/////////////
notleafcount_=notleafcount(t);////
cout<<endl;
cout<<"非葉子結點的數量為:"<<notleafcount_<<endl;
int node_number=0; //初始化全部結點的數目為0
node_number=node_num(t);
cout<<"二叉樹全部結點的數量為:"<<node_number<<endl;
}
運行結果: