二叉树的基本操作-递归实现
2015-09-02 00:33
375 查看
二叉树的一些基本操作学习
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;
}
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;
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例
- python数据结构之二叉树的建立实例
- python数据结构树和二叉树简介
- python数据结构之二叉树的统计与转换实例