二叉树的一些基本操作学习
1.二叉树定义
typedef char Elemtype;
typedef struct TreeNode
{
Elemtype data;
struct TreeNode *lchild,*rchild;
}TreeNode,*BinTree;
2.二叉树建立(先序递归建立)
//先序序列构造二叉树,形如ABC##DE###FG###
void CreatTree(BinTree &T)
3.先序递归遍历二叉树
void PreOrderBinTree(BinTree T)
4.中序递归遍历二叉树
void InOrderBinTree(BinTree T)
5.后序递归遍历二叉树
void PostOrderBinTree(BinTree T)
6.求二叉树深度
int TreeDepth(BinTree T)
7.求叶子结点数
int TreeLeaves(BinTree T)
8.交换左右孩子
void ExChild(BinTree T)
9.二叉树销毁
void DestroyTree(BinTree &T)
完整例子:
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
typedef char Elemtype;
typedef struct TreeNode
{
Elemtype data;
struct TreeNode *lchild,*rchild;
}TreeNode,*BinTree;
//先序序列构造二叉树,形如ABC##DE###FG###
void CreatTree(BinTree &T)
{
Elemtype ch;
cin>>ch;
if(ch=='#')
{
T=NULL;
}
else
{
T=new TreeNode; //T=(TreeNode*)malloc(sizeof(TreeNode));
T->data=ch;
CreatTree(T->lchild);
CreatTree(T->rchild);
}
}
//递归先序遍历二叉树
void PreOrderBinTree(BinTree T)
{
if(T!=NULL)
{
cout<<T->data<<" "; //访问结点
PreOrderBinTree(T->lchild);
PreOrderBinTree(T->rchild);
}
}
//递归中序遍历二叉树
void InOrderBinTree(BinTree T)
{
if(T!=NULL)
{
InOrderBinTree(T->lchild);
cout<<T->data<<" "; //访问结点
InOrderBinTree(T->rchild);
}
}
void PostOrderBinTree(BinTree T)
{
if(T!=NULL)
{
PostOrderBinTree(T->lchild);
PostOrderBinTree(T->rchild);
cout<<T->data<<" "; //访问结点
}
}
int TreeDepth(BinTree T)
{
int ldepth,rdepth;
if(T==NULL) return 0;
ldepth=TreeDepth(T->lchild);
rdepth=TreeDepth(T->rchild);
return ldepth>rdepth?(ldepth+1):(rdepth+1);
}
int TreeLeaves(BinTree T)
{
if(T==NULL) return 0;
if(T->lchild==NULL && T->rchild==NULL) return 1;
return TreeLeaves(T->lchild)+TreeLeaves(T->rchild);
}
void ExChild(BinTree T)
{
if(T!=NULL)
{
BinTree temp=NULL;
if(T->lchild!=NULL || T->rchild!=NULL)
{
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
ExChild(T->lchild);
ExChild(T->rchild);
}
}
}
void DestroyTree(BinTree &T)
{
if(T!=NULL)
{
DestroyTree(T->lchild);
DestroyTree(T->rchild);
delete T; //free(T);
T=NULL;
}
}
//主函数
int main()
{
BinTree T;
CreatTree(T);
//PreOrder
cout<<"PreOrderBinTree:"<<endl;
PreOrderBinTree(T);
cout<<endl;
//InOrder
cout<<"InOrderBinTree:"<<endl;
InOrderBinTree(T);
cout<<endl;
//PostOrder
cout<<"PostOrderBinTree:"<<endl;
PostOrderBinTree(T);
cout<<endl;
//Tree depth
cout<<"Tree depth:"<<TreeDepth(T)<<endl;
//The number of leaves
cout<<"The number of leaves:"<<TreeLeaves(T)<<endl;
//Exchange Tree lchild and rchild;
ExChild(T);
cout<<"After exchange Tree child:"<<endl;
PreOrderBinTree(T);
cout<<endl;
//Destroy Tree
cout<<"Destroy Tree."<<endl;
DestroyTree(T);
return 0;
}