二叉树的应用(复制二叉树、计算二叉树的深度、计算二叉树的总结点个数、计算叶子结点的个数)
复制二叉树
如果是空树,递归结束;
否则,申请新结点空间,复制根结点
递归复制左子树
递归复制右子树
计算二叉树的深度
空树:深度为0
不为空,递归计算左子树的深度记为m,递归计算右子树的深度为n,二叉树的深度则为max(m,n)+1
+1是根节点的深度是子树的深度+1。
计算二叉树的结点总数
空树:结点总数为0
不为空,则计算左子树的结点个数+右子树的结点个数+1
计算左右子树的结点个数也是递归进行计算。
计算叶子结点的个数
空树:结点个数为0
否则:左子树上的叶子结点个数+右子结点的结点个数
#include <iostream>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef char TElemType;
using namespace std;
typedef struct BiTNode {
TElemType data;//数据域
BiTNode* lchild, * rchild;//新建两个指针指向左孩子和右孩子
}BiTNode, * BiTree;
//创建二叉树
//先序递归创建二叉树
void create(BiTree& T) {
T = new BiTNode;
char ch;
cin >> ch;
if (ch == '#') {
T = NULL;
}
else {
T->data = ch;
create(T->lchild);
create(T->rchild);
}
}
//复制二叉树
void copyBiTree(BiTree T, BiTree& NewT) {
if (T==NULL)
{
NewT = NULL;
}
else
{
//复制根结点
NewT = new BiTNode;
NewT->data = T->data;
copyBiTree(T->lchild, NewT->lchild);
copyBiTree(T->rchild, NewT->rchild);
}
}
//计算二叉树的总的结点个数
int BiTreeNode(BiTree T) {
if (T==NULL)
{
return 0;
}
else {
return BiTreeNode(T->lchild) + BiTreeNode(T->rchild)+1;
}
}
//计算二叉树的深度
int BiTreeDepth(BiTree T) {
if (T==NULL)
{
return 0;
}
else {
return max(BiTreeDepth(T->lchild), BiTreeDepth(T->rchild)) + 1;
}
}
//计算叶子结点的个数
int leafCount(BiTree T) {
if (T==NULL)
{
return 0;
}
else if (T->lchild==NULL&&T->rchild==NULL)
{
return 1;
}
else {
return leafCount(T->lchild) + leafCount(T->rchild);
}
}
//前序遍历输出
void preTraverse(BiTree T)
{
if (T)
{
cout << T->data << " ";
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
int main() {
BiTree T;
BiTree NewT;
create(T);
printf("\n先序遍历原来的二叉树:");
preTraverse(T);
copyBiTree(T, NewT);
printf("\n先序遍历复制的二叉树:");
preTraverse(NewT);
//计算二叉树的结点数量
int count = BiTreeNode(T);
printf("\n%d", count);
//计算二叉树的深度
int depth = BiTreeDepth(T);
printf("\n%d", depth);
//计算叶子结点的数量
int leaf = leafCount(T);
printf("\n%d", leaf);
return 0;
}