#二叉树的创建、先序、中序、后序遍历、层次遍历、树的高度、结点数、叶子结点数、左右结点交换
下面展示一些 内联代码片
。
#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include <string.h>
using namespace std;
//定义二叉树结构
typedef struct Node
{
char data;
struct Node *lchild,*rchild;//创建左右结点指针
}*BTree,BTNode;
//程序使用的函数
void CreateBTree(BTree &T);//按先序遍历方式创建二叉树
void PreOrderTraverse(BTree T);//先序遍历函数
void InOrderTraverse(BTree T);//中序遍历函数
void PostOrderTraverse(BTree T);//后序遍历函数
void LevelTraverse(BTree T) ;//层次遍历函数
int SearchDepth(BTree T);//求树的高度度函数
int NodeNum(BTree T);//求二叉树中结点个数函数
int LeafNum(BTree T);//求二叉树中叶子结点个数函数
void ExChangeTree(BTree &T);//左右结点交换函数
//按先序遍历方式创建二叉树
void CreateBTree(BTree &T)
{
char ch;
cin>>ch;//将输入的字符储存在数组ch中
if(ch=='*')//定义符号*为空树
T=NULL;
else //输入字符不为*,将其储存在树中
{
T=new BTNode;
T->data=ch;
CreateBTree(T->lchild);
CreateBTree(T->rchild);
}
}
//先序遍历函数
void PreOrderTraverse(BTree T)
{
if(T!=NULL)//当结点不为空时,遍历二叉树
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历函数
void InOrderTraverse(BTree T)
{
if(T!=NULL)//当结点不为空时,遍历二叉树
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
//后序遍历函数
void PostOrderTraverse(BTree T)
{
if(T!=NULL)//当结点不为空时,遍历二叉树
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
//层次遍历函数
void LevelTraverse(BTree T)
{
if(T==NULL)
{
printf("二叉树为空树");
return;
}
BTNode *queue[50]; //创建应该队列
int front=0;
int rear=0;
BTNode *p;
queue[rear]=T;//树根入队
while(front!=rear)//当前端和后端不相等时
{
p=queue[front];//p指向根,读出根,并出队
printf("%c",p->data);//输出二叉树的结点
if(p->lchild!=NULL) //左子树不为空,入队
{
queue[rear]=p->lchild;
}
if(p->rchild!=NULL) //右子树不为空,入队
{
queue[rear]=p->rchild;
}
}
}
//求树的高度度函数
int SearchDepth(BTree T)
{
if(T==NULL)
{
return 0;
}
else
{
int m=SearchDepth(T->lchild);
int n=SearchDepth(T->rchild);
if(m>n)
{
return (m+1);
}
else
{
return (n+1);
}
}
}
//求二叉树中结点个数函数
int NodeNum(BTree T)
{
if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
{
return 0;
}
else //第一个结点不为空,结点数为左右子树数加上第一个结点
{
return NodeNum(T->lchild)+NodeNum(T->rchild)+1;
}
}
//求二叉树中叶子结点个数函数
int LeafNum(BTree T)
{
if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
{
return 0;
}
if(T->lchild==NULL &&T->rchild==NULL)//如果二叉树左右子树皆为空,说明该二叉树只有根节点为叶子节点,返回值1.
{
return 1;
}
else //否则叶子结点数为左右子树之和
{
return LeafNum(T->lchild)+LeafNum(T->rchild);
}
}
//左右结点交换函数
void ExChangeTree(BTree &T)
{
BTree tem;
if(T!=NULL)//判断T是否为空,非空进行转换,否则不转换
{
tem=T->lchild;
T->lchild=T->rchild;//直接交换节点地址
T->rchild=tem;
ExChangeTree(T->lchild);
ExChangeTree(T->rchild);
}
}
int main()//主函数调用前面子函数并输出结果
{
BTree T;
cout<<"按先序遍历方式创建二叉树(用*表示空树):";
CreateBTree(T);
cout<<"中序遍历输出结果:";
InOrderTraverse(T);
cout<<endl<<"先序遍历输出结果:";
PreOrderTraverse(T);
cout<<endl<<"后序遍历输出结果:";
PostOrderTraverse(T);
cout<<endl<<"层次遍历输出结果:";
LevelTraverse(T);
cout<<endl<<"树的高度:"<<SearchDepth(T);
cout<<endl<<"总结点的个数:"<<NodeNum(T);
cout<<endl<<"叶结点的个数:"<<LeafNum(T);
BTree temporarytree=T; //复制一颗树,在不改变原树的情况下,对临时树进行交换。
ExChangeTree(temporarytree);
cout<<endl<<"左右结点交换结果:";
PreOrderTraverse(temporarytree);
printf("\n");
return 0;
}