二叉树的一些递归算法(构建、遍历、求结点数、高度)

5 篇文章 0 订阅
3 篇文章 0 订阅

        二叉树的数据结构中,例如构建一棵二叉树、遍历一棵二叉树、以及求一棵二叉树的高度或者结点总数,都可以运用到递归算法,递归算法一般比较简洁,便于理解,但也存在一定的缺陷,例如递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。

        不过这一篇先看看递归的,下一篇再谈谈非递归如何实现二叉树的创建、遍历等。

#include<stdio.h>
#include<stdlib.h>
#define Max 50

typedef struct BiTNode    //二叉树结点结构体
{
	char element;      //数据域
	struct BiTNode *lchild, *rchild;      //指针域
}BiTNode, *BiTree;     //定义一个指向struct BiTNode的指针

//先序构建二叉树(这里没有循环语句强调输入元素,但是函数为递归函数,结束的条件是输入的所有值为叶子结点)
void CreateBiTree(BiTree &T) 
{
	char ch;
	ch = getchar();
	if (ch == '#')    //#代表空指针
		T = NULL;
	else
	{
		T = (BiTNode*)malloc(sizeof(BiTNode));
		T->element = ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

//先序输出二叉树(也是递归函数,结束的条件是输出最后一个结点)
void PreOrder(BiTree T)
{
	if (T)
	{
		printf("%2c", T->element);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}

//中序遍历输出二叉树
void InOrder(BiTree T)
{
	if (T)
	{
		InOrder(T->lchild);
		printf("%2c", T->element);
		InOrder(T->rchild);
	}
}

//后续遍历输出二叉树
void PostOrder(BiTree T)
{
	if (T)
	{
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		printf("%2c", T->element);
	}
}

//求二叉树的高度
int depth(BiTree T)
{
	int dep1, dep2;
	if (T == NULL)
		return 0;
	else
	{
		dep1 = depth(T->lchild);
		dep2 = depth(T->rchild);
		return dep1 > dep2 ? dep1 + 1 : dep2 + 1;
	}
}

//求二叉树的叶子结点
int TreeSize(BiTree T)
{
	if (!T)
		return 0;
	else
		return TreeSize(T->lchild) + TreeSize(T->rchild) + 1;
}

void Clear(BiTree t)  //清空二叉树
{
	if (!t)
		return;
	Clear(t->lchild);
	Clear(t->rchild);
	free(t);
}



void main() {
	int i, j;
	BiTree T = NULL;     //创建了一指针
	printf("创建先序构建的二叉树:\n");
	CreateBiTree(T);
	printf("\n先序遍历的结果为:");
	PreOrder(T);
	printf("\n中序遍历的结果为:");
	InOrder(T);
	printf("\n后序遍历的结果为:");
	PostOrder(T);
	int height = depth(T);
	printf("\n树高为:%d",height);
	int acount = TreeSize(T);
	printf("\n二叉树结点个数为:%d\n", acount);
}

结果如下:

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值