二叉树的基本操作
内容
此文章用c语言实现了二叉树的基本操作,包括先序创建二叉树,先序、中序、后序遍历二叉树,计算叶子节点的个数以及输出叶子节点,求二叉树的深度
1.先序创建二叉树
结构体定义二叉树的左孩子,右孩子,以及创建一个char型data字符用来输入二叉树的节点
typedef struct node{
struct node* lchild;//左孩子
struct node* rchild;//右孩子
char data;//输入字符
}BiTreeNode,*BiTree;
2.先序遍历二叉树
顺序为根左右,先输出根节点,再递归遍历左右子树
中序后序只需要按左根右,左右根的顺序写就好了,只是调换了一下代码顺序
void preTraverse(BiTree T)
{
if (T)
{
cout << T->data;
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
3.计算叶子节点个数
计算个数,函数类型为整形int,首先考虑空节点,就返回0,然后考虑叶子节点,即没有左右子树的节点,返回1,再然后递归计算左右子树的叶子节点个数
int countleavenumber(BiTree T) {
if (T == NULL)
return 0;
else if (T->lchild == NULL && T->rchild == NULL)//是叶子节点就返回1
return 1;
else
return(countleavenumber(T->lchild) + countleavenumber(T->rchild));
//左子树节点个数+右子树节点个数
}
4.输出叶子节点
思路很简单,在递归算法中增加一个if语句的筛选条件:左右子树书否为空。
void leaveTraverse(BiTree T) {
if (T)
{
if (!T->lchild && !T->rchild)//遍历算法中增加左右子树是否为空的条件
cout << T->data;
leaveTraverse(T->lchild);
leaveTraverse(T->rchild);
}
}
5.求二叉树的深度
二叉树深度为左右子树的最大高度加1
//求二叉树的深度
int getheight(BiTree T) {
int lheight;
int rheight;
int MaxH;
if (T)
{
lheight = getheight(T->lchild);//求左子树高度
rheight = getheight(T->rchild);//求右子树高度
MaxH = (lheight > rheight) ? lheight : rheight;//求左右子树的最大高度
return (MaxH + 1);
}
else
return 0;//空树返回0
}
完整代码实现如下:
#include <iostream>
#include<stdio.h>
using namespace std;
//定义节点结构体
typedef struct node{
struct node* lchild;//左孩子
struct node* rchild;//右孩子
char data;//输入字符
}BiTreeNode,*BiTree;
//先序创建一个二叉树
void createBiTree(BiTree &T) {//便于节点的更改故使用引用
char c;
cin >> c;
if (c == '#')
T = NULL;
else {
T = new BiTreeNode;
T->data = c;
createBiTree( T->lchild );
createBiTree(T->rchild);
}
}
//先序遍历二叉树
void preTraverse(BiTree T)
{
if (T)
{
cout << T->data;
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
//中序遍历二叉树
void inTraverse(BiTree T)
{
if (T)
{
inTraverse(T->lchild);
cout << T->data;
inTraverse(T->rchild);
}
}
//后序遍历二叉树
void postTraverse(BiTree T)
{
if (T)
{
postTraverse(T->lchild);
postTraverse(T->rchild);
cout << T->data;
}
}
//计算叶子节点个数
int countleavenumber(BiTree T) {
if (T == NULL)
return 0;
else if (T->lchild == NULL && T->rchild == NULL)//是叶子节点就返回1
return 1;
else
return(countleavenumber(T->lchild) + countleavenumber(T->rchild));
//左子树节点个数+右子树节点个数
}
//输出叶子节点
void leaveTraverse(BiTree T) {
if (T)
{
if (!T->lchild && !T->rchild)//遍历算法中增加左右子树是否为空的条件
cout << T->data;
leaveTraverse(T->lchild);
leaveTraverse(T->rchild);
}
}
//求二叉树的深度
int getheight(BiTree T) {
int lheight;
int rheight;
int MaxH;
if (T)
{
lheight = getheight(T->lchild);//求左子树高度
rheight = getheight(T->rchild);//求右子树高度
MaxH = (lheight > rheight) ? lheight : rheight;//求左右子树的最大高度
return (MaxH + 1);
}
else
return 0;
}
int main()
{
BiTree T;//声明一个二叉树
//先序建立一个二叉树
createBiTree(T);
cout << "二叉树创建完成" << endl;
cout << "先序遍历二叉树为" << endl;
preTraverse(T);
cout << endl;
cout << "中序遍历二叉树为" << endl;
inTraverse(T);
cout << endl;
cout << "后序遍历二叉树为" << endl;
postTraverse(T);
cout << endl;
cout << "叶子节点个数为:" << countleavenumber(T) << endl;
cout << "叶子结点为: "<< endl;
leaveTraverse(T);
cout << endl;
cout << "二叉树的深度为: " << getheight(T) << endl;
return 0;
}