由数组创建二叉树,二叉树遍历,获取深度,销毁

先序遍历:A->B->D->E->C

中序遍历:D->B->E->A->C

后序遍历:D->E->B->C->A


#include <iostream>
typedef char ElemType;
#define EndElem '^'//用^来表示空

typedef struct BiNode
{
	ElemType elem;
	struct BiNode * lchild;
	struct BiNode * rchild;
} * BiTree;

//以先序遍历的方式创建一棵二叉树
void PreCreateBiTree(BiTree & pnode, ElemType a[], int n)
{
	static int curr = 0;//当前下标
	if (a[curr] == EndElem)
	{
		pnode = NULL;
		curr++;
		if (curr == n)
		{
			curr = 0;//为下一次不同对象调用此函数做好准备
		}
		return;
	}
	pnode = new BiNode;
	pnode->elem = a[curr];
	curr++;
	PreCreateBiTree(pnode->lchild, a, n);
	PreCreateBiTree(pnode->rchild, a, n);
}

//使用二重指针实现,注意调用的时候第一个参数是struct BiNode **;
//void PreCreateBiTree(BiTree * ppnode, ElemType a[], int n)
//{
//	static int curr = 0;/*当前下标*/
//	if (a[curr] == EndElem)
//	{
//		(*ppnode) = NULL;
//		curr++;
//		if (curr == n)
//		{
//			curr = 0;
//		}
//		return;
//	}
//	*ppnode = new BiNode;
//	(*ppnode)->elem = a[curr];
//	curr++;
//	PreCreateBiTree(&((*ppnode)->lchild), a, n);
//	PreCreateBiTree(&((*ppnode)->rchild), a, n);
//}

//先序遍历
void PreTraverseBiTree(BiTree pnode)
{
	if (pnode == NULL)
	{
		return;
	}
	std::cout << pnode->elem << ' ';
	PreTraverseBiTree(pnode->lchild);
	PreTraverseBiTree(pnode->rchild);
}

//中序遍历
void MidTraverseBiTree(BiTree pnode)
{
	if (pnode == NULL)
	{
		return;
	}
	//遍历的不同在于下面三者的顺序
	MidTraverseBiTree(pnode->lchild);
	std::cout << pnode->elem << ' ';
	MidTraverseBiTree(pnode->rchild);
}

//后序遍历
void PosTraverseBiTree(BiTree pnode)
{
	if (pnode == NULL)
	{
		return;
	}
	PosTraverseBiTree(pnode->lchild);
	PosTraverseBiTree(pnode->rchild);
	std::cout << pnode->elem << ' ';
}

//获取深度
int Depth(BiTree pnode)
{
	if (pnode == NULL)
	{
		return 0;
	}
	int leftDepth = Depth(pnode->lchild);
	int rightDepth = Depth(pnode->rchild);
	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}

void DestroyBiTree(BiTree & pnode)
{
	if (pnode == NULL)
	{
		return;
	}
	struct BiNode * pleft = pnode->lchild;
	struct BiNode * pright = pnode->rchild;
	delete pnode;
	DestroyBiTree(pleft);
	DestroyBiTree(pright);
}

int main()
{
	char source[11] = {'A', 'B', 'D', '^',  '^', 'E', '^', '^', 'C', '^', '^'};//按先序遍历排好的数组
	BiTree tree = NULL;
	PreCreateBiTree(tree, source, 11);
	PreTraverseBiTree(tree);	
	std::cout << Depth(tree) << std::endl;
	DestroyBiTree(tree);


	//std::cout << std::endl;
	//BiTree tree2 = NULL;
	//PreCreateBiTree(tree2, source, 11);
	//PosTraverseBiTree(tree2);
	//DestroyBiTree(tree2);

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值