二叉树

【注:非递归遍历及层序遍历等引用栈和队列,实现过程见栈和队列及其应用】

BinaryTree.h

#pragma once

#include<stdio.h>
#include<stdlib.h>

typedef char _BTDataType;

typedef struct BinaryTreeNode
{
	_BTDataType _data;
	struct BinaryTreeNode * _left;
	struct BinaryTreeNode * _right;
}BinaryTreeNode;

BinaryTreeNode * BuyBinaryNode(_BTDataType x);
BinaryTreeNode * CreateBinaryTree(_BTDataType * a, int n, int * pi);
void DestoryBinaryTree(BinaryTreeNode ** pptree);

BinaryTreeNode * FindBinaryTree(BinaryTreeNode * root, _BTDataType x);

int SizeBinaryTree(BinaryTreeNode * root);
int LeafSizeBinaryTree(BinaryTreeNode * root);
int LevelKSizeBinaryTree(BinaryTreeNode * root, int k);//第K层结点个数
int HeightBinaryTree(BinaryTreeNode * root);
int FullBinaryTree(BinaryTreeNode * root);
int CompleteBinaryTree(BinaryTreeNode * root);

void PrevOrderBinaryTree(BinaryTreeNode * root);
void InOrderBinaryTree(BinaryTreeNode * root);
void PostOrderBinaryTree(BinaryTreeNode * root);

//遍历的非递归
void PrevOrderBinaryTreeNonR(BinaryTreeNode * root);
void InOrderBinaryTreeNonR(BinaryTreeNode * root);
void PostOrderBinaryTreeNonR(BinaryTreeNode * root);
void LevelOrderBinaryTree(BinaryTreeNode * root);//层序遍历

BinaryTree.c

#include"BinaryTree.h"
#include"Queue.h"
#include"Stack.h"

BinaryTreeNode * BuyBinaryNode(_BTDataType x)
{
	BinaryTreeNode * node = (BinaryTreeNode *)malloc(sizeof(BinaryTreeNode));
	node->_data = x;
	node->_left = NULL;
	node->_right = NULL;
	return node;
}

BinaryTreeNode * CreateBinaryTree(_BTDataType * a, int n, int * pi)
{
	if (a[*pi] != '#')
	{
		BinaryTreeNode * root = BuyBinaryNode(a[*pi]);

		++(*pi);
		root->_left = CreateBinaryTree(a, n, pi);

		++(*pi);
		root->_right = CreateBinaryTree(a, n, pi);

		return root;
	}

	return NULL;
}

void DestoryBinaryTree(BinaryTreeNode ** pptree)
{
	BinaryTreeNode * root = *pptree;

	if (root == NULL)
		return;

	DestoryBinaryTree(&root->_left);
	DestoryBinaryTree(&root->_right);
	free(root);

	*pptree = NULL;
}

BinaryTreeNode * FindBinaryTree(BinaryTreeNode * root, _BTDataType x)
{
	BinaryTreeNode * ret;

	if (root == NULL || root->_data == x)
		return root;

	ret = FindBinaryTree(root->_left, x);
	if (ret)
		return ret;

	ret = FindBinaryTree(root->_right, x);
	if (ret)
		return ret;

	return NULL;
}

int SizeBinaryTree(BinaryTreeNode * root)
{
	if (root == NULL)
		return 0;

	return SizeBinaryTree(root->_left) + SizeBinaryTree(root->_right) + 1;
}

int LeafSizeBinaryTree(BinaryTreeNode * root)
{
	if (root == NULL)
		return 0;

	if (root->_left == NULL && root->_right == NULL)
		return 1;

	return LeafSizeBinaryTree(root->_left) + LeafSizeBinaryTree(root->_right);
}

int LevelKSizeBinaryTree(BinaryTreeNode * root, int k)
{
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return LevelKSizeBinaryTree(root->_left, k - 1) + LevelKSizeBinaryTree(root->_right, k - 1);
}

int HeightBinaryTree(BinaryTreeNode * root)
{
	int left_height = 0, right_height = 0;

	if (root == NULL)
		return 0;

	left_height = HeightBinaryTree(root->_left) + 1;
	right_height = HeightBinaryTree(root->_right) + 1;

	return left_height > right_height ? left_height : right_height;
}

int FullBinaryTree(BinaryTreeNode * root)
{
	Queue q;
	InitQueue(&q);

	if (root)
		PushQueue(&q, root);

	while (isEmptyQueue(&q))
	{
		_QTdatatype front = FrontQueue(&q);

		if ((front->_left == NULL && front->_right == NULL) ||
			(front->_left != NULL && front->_right != NULL))
			PopQueue(&q);
		else
			return 0;

		if (front->_left)
			PushQueue(&q, front->_left);

		if (front->_right)
			PushQueue(&q, front->_right);
	}

	DestoryQueue(&q);
	return 1;
}

int CompleteBinaryTree(BinaryTreeNode * root)
{
	Queue q;
	InitQueue(&q);

	if (root)
		PushQueue(&q, root);

	while (isEmptyQueue(&q))
	{
		BinaryTreeNode * front = FrontQueue(&q);
		PopQueue(&q);

		if (front)
		{
			PushQueue(&q, front->_left);
			PushQueue(&q, front->_right);
		}
		else
			break;
	}
	while (isEmptyQueue(&q))
	{
		BinaryTreeNode * front = FrontQueue(&q);

		if (front)
			return 0;
		PopQueue(&q);
	}

	DestoryQueue(&q);
	return 1;
}

void PrevOrderBinaryTree(BinaryTreeNode * root)
{
	if (root == NULL)
		return;
	printf("%c ",root->_data);
	PrevOrderBinaryTree(root->_left);
	PrevOrderBinaryTree(root->_right);
}

void InOrderBinaryTree(BinaryTreeNode * root)
{
	if (root == NULL)
		return;
	InOrderBinaryTree(root->_left);
	printf("%c ",root->_data);
	InOrderBinaryTree(root->_right);
}

void PostOrderBinaryTree(BinaryTreeNode * root)
{
	if (root == NULL)
		return;
	PostOrderBinaryTree(root->_left);
	PostOrderBinaryTree(root->_right);
	printf("%c ", root->_data);
}

void PrevOrderBinaryTreeNonR(BinaryTreeNode * root)
{
	_STDataType cur = root;
	Stack s;
	InitStack(&s);

	while (cur || isEmptyStack(&s))
	{
		//访问左路节点,左路节点入栈
		while (cur)
		{
			printf("%c ", cur->_data);
			PushStack(&s, cur);
			cur = cur->_left;
		}

		//栈里面出来的节点,表示左数已经访问过了
		_STDataType top = TopStack(&s);
		PopStack(&s);

		//子问题方式访问右子树
		cur = top->_right;
	}

	DestoryStack(&s);
}

void InOrderBinaryTreeNonR(BinaryTreeNode * root)
{
	_STDataType cur = root;
	Stack s;
	InitStack(&s);

	while (cur || isEmptyStack(&s))
	{
		while (cur)
		{
			PushStack(&s, cur);
			cur = cur->_left;
		}

		_STDataType top = TopStack(&s);
		printf("%c ", top->_data);
		PopStack(&s);

		cur = top->_right;
	}

	DestoryStack(&s);
}

void PostOrderBinaryTreeNonR(BinaryTreeNode * root)
{
	_STDataType cur = root;
	_STDataType prev = NULL;
	Stack s;
	InitStack(&s);

	while (cur || isEmptyStack(&s))
	{
		while (cur)
		{
			PushStack(&s, cur);
			cur = cur->_left;
		}

		_STDataType top = TopStack(&s);

		//右子树为空 || 上一个访问的节点是我右子树的根
		if (top->_right == NULL || top->_right == prev)
		{
			printf("%c ", top->_data);
			prev = top;
			PopStack(&s);
		}
		else
			cur = top->_right;
	}

	DestoryStack(&s);
}

void LevelOrderBinaryTree(BinaryTreeNode * root)
{
	Queue q;
	InitQueue(&q);

	if (root)
		PushQueue(&q, root);

	while (isEmptyQueue(&q))
	{
		_QTdatatype front = FrontQueue(&q);
		printf("%c ", front->_data);
		PopQueue(&q);

		if (front->_left)
			PushQueue(&q, front->_left);

		if (front->_right)
			PushQueue(&q, front->_right);
	}

	DestoryQueue(&q);
}

Test.c

#include"BinaryTree.h"

void testBinaryTree()
{

	int i = 0;
	BinaryTreeNode * ret;
	//char array[] = {'A','B','D','#','#','#','C','E','#','#','F','#','G','#','#'};
	char array[] = { 'A','B','D','#','#','E','#','#','C','F','#','#','G','#','#' };

	BinaryTreeNode * tree = CreateBinaryTree(array, sizeof(array) / sizeof(_BTDataType), &i);
	
	PrevOrderBinaryTree(tree);
	printf("\n");

	InOrderBinaryTree(tree);
	printf("\n");

	PostOrderBinaryTree(tree);
	printf("\n");

	PrevOrderBinaryTreeNonR(tree);
	printf("\n");

	InOrderBinaryTreeNonR(tree);
	printf("\n");

	PostOrderBinaryTreeNonR(tree);
	printf("\n");

	LevelOrderBinaryTree(tree);
	printf("\n");

	ret = FindBinaryTree(tree, 'E');
	printf("'E'	%p\n", ret);
	ret = FindBinaryTree(tree, 'X');
	printf("'X'	%p\n", ret);

	printf("SizeBinaryTree		%d\n", SizeBinaryTree(tree));
	printf("LeafSizeBinaryTree	%d\n", LeafSizeBinaryTree(tree));
	printf("LevelKSizeBinaryTree	%d\n", LevelKSizeBinaryTree(tree,2));
	printf("HeightBinaryTree	%d\n", HeightBinaryTree(tree));
	printf("FullBinaryTree		%d\n", FullBinaryTree(tree));
	printf("CompleteBinaryTree	%d\n", CompleteBinaryTree(tree));

	DestoryBinaryTree(&tree);

}

int main()
{
	testBinaryTree();
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值