对于二叉树的操作一般的我们使用递归的方法,因为在二叉树中每一个子树又是一颗二叉树。
这篇代码主要是演示了二叉树的以下操作
- 二叉树的创建
- 二叉树的三种遍历
- 求解二叉树的高度
- 求解指定层数的结点个数
- 求解二叉树的叶子结点个数
/*********************************************************
- Copyright (C): 2016
- File name : tree.c
- Author : - Zhaoxinan -
- Date : 2016年07月31日 星期日 19时44分36秒
- Description :
* *******************************************************/
#include <stdio.h>
#include <stdlib.h>
//定义结点
typedef struct BiTNode
{
char data; //数据
struct BiTNode *lchild; //左孩子
struct BiTNode *rchild; //右孩子
}BiTNode, *BiTree;
//////////////////////////////////////////////////////////
//先序创建二叉树
BiTree CreateBiTree()
{
char ch;
BiTree T;
scanf("%c", &ch);
if (ch == '#')
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;
}
//////////////////////////////////////////////////////////
//先序遍历而叉树
void PreOrderTraverse(BiTree T)
{
if (T)
{
printf("%c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//////////////////////////////////////////////////////////
//中序遍历二叉树
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->lchild);
printf("%c",T->data);
InOrderTraverse(T->rchild);
}
}
//////////////////////////////////////////////////////////
//后序遍历二叉树
void PostOrderTraverse(BiTree T)
{
if (T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c", T->data);
}
}
/*
求二叉树中的节点个数
递归解法:
1、如果二叉树为空,节点个数为0
2、如果二叉树不为空,二叉树节点个数 = 左子树节点个数+右子树节点个数+1
*/////////////////////////////////////////////////////////
int GetNodeNum(BiTree T)
{
if (T == NULL)
{
return 0;
}
return GetNodeNum(T->lchild)+GetNodeNum(T->rchild)+1;
}
/*///
求二叉树的深度
递归解法:
1、如果二叉树为空,二叉树的深度为0
2、如果二叉树不为空,二叉树的深度= max(左子树深度+右子树深度)+1
*//////////////////////////////////////////////////////
int GetTreeDepth(BiTree T)
{
if (T == NULL)
{
return 0;
}
int LDepth = GetTreeDepth(T->lchild);
int RDepth = GetTreeDepth(T->rchild);
return LDepth > RDepth ? (LDepth + 1) : (RDepth + 1);
}
/*///
求二叉树第K层的节点个数
1、如果二叉树为空或着k<1 返回0
2、如果二叉树不为空并且K == 1,返回1
3、如果二叉树不为空并且K>1,返回左子树中K-1层的节点个数与右子树k-1层节点个数之和
*//////////////////////////////////////////////////////
int GetNodeNumKthLevel(BiTree T, int k)
{
if (T == NULL || k < 1)
{
return 0;
}
if (k == 1)
{
return 1;
}
int numleft = GetNodeNumKthLevel(T->lchild, k-1);
int numright = GetNodeNumKthLevel(T->rchild, k-1);
return (numleft + numright);
}
/*///
求二叉树中叶子节点的个数
1、如果二叉树为空,返回0
2、如果二叉树不为空且左右子树为空,返回1
3、如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数
*///////////////////////////////////////////////////////
int GetLeafNodeNum(BiTree T)
{
if (T == NULL)
{
return 0;
}
if (T->lchild == NULL && T->rchild == NULL)
{
return 1;
}
int numleft = GetLeafNodeNum(T->lchild);
int numright = GetLeafNodeNum(T->rchild);
return (numleft + numright);
}
//////////////////////////////////////////////////////////
int main()
{
int TreeLevel; //二叉树的层数
int TreeLeafNum = 0; //二叉树的叶子节点个数
int TreeKlevelNum = 0; //二叉树第K层的节点个数
int TreeDepth = 0; //二叉树的深度
int TreeNodeNum = 0; //二叉树结点个数
BiTree T;
T = CreateBiTree(); //创建二叉树
printf("\n----------前序遍历---------\n");
PreOrderTraverse(T);
printf("\n----------中序遍历---------\n");
InOrderTraverse(T);
printf("\n----------后序遍历---------\n");
PostOrderTraverse(T);
printf("\n----------节点个数---------\n");
TreeNodeNum = GetNodeNum(T);
printf("%d\n", TreeNodeNum);
printf("\n----------树的深度---------\n");
TreeDepth = GetTreeDepth(T);
printf("%d\n", TreeDepth);
printf("\n---------树的叶子节点-------\n");
TreeLeafNum = GetLeafNodeNum(T);
printf("%d\n", TreeLeafNum);
printf("\n请输入树的层数,将会得到该层节点数\n");
scanf("%d", &TreeLevel);
TreeKlevelNum = GetNodeNumKthLevel(T, TreeLevel);
printf("\n---------%d层节点数--------\n", TreeLevel);
printf("%d\n", TreeKlevelNum);
return 0;
}
对应以上代码,我们将#代替空结点
例如:我们输入AB##CD##EF###代表如下树
代码测试结果如下