数据结构--二叉树(链式)

什么是二叉树?

       二叉树是一个由节点构成的一个有限集合,该集合由一个根节点加上两颗分别成为左子树和右子树的二叉树组成或者为空。

今天我们来重点讲一下链式二叉树,普通二叉树的增删查改没有太大意义,重点是掌握二叉树的遍历,求二叉树节点个数,高度,判断是否为完全二叉树。

链式二叉树的重要思想就是递归,递归是把一个大型复杂的问题,转化为一个与原问题相似,但规模较小的子问题来求解,直到子问题不能再被拆分,递归便结束了。

接下来我们来看二叉树的各功能实现方法 

#include"Tree.h"
#include"Queue.h"

//树节点的创造
TreeNode* BuyNode(TDataType x)
{
	TreeNode* ret = (TreeNode*)malloc(sizeof(TreeNode));
	ret->data = x;
	ret->left = ret->right = NULL;
	return ret;
}

//树的根节点
TreeNode* TreeCreate()
{
	TreeNode* Node1 = BuyNode('A');
	TreeNode* Node2 = BuyNode('B');
	TreeNode* Node3 = BuyNode('C');
	TreeNode* Node4 = BuyNode('D');
	TreeNode* Node5 = BuyNode('E');
	TreeNode* Node6 = BuyNode('F');
	TreeNode* Node7 = BuyNode('G');
	Node1->left = Node2;
	Node1->right = Node3;
	Node2->left = Node4;
	Node2->right = Node5;
	Node3->left = Node6;
	Node3->right = Node7;
	return Node1;
}

//树的前序遍历
void PreOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	printf("%c ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}
//树的中序遍历
void InOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	InOrder(root->left);
	printf("%c ", root->data);
	InOrder(root->right);
}

//树的后序遍历
void LastOrder(TreeNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	LastOrder(root->left);
	LastOrder(root->right);
	printf("%c ", root->data);
}

//树的节点个数
int TreeSize(TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}

//树的高度
int TreeHeight(TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftheight = TreeHeight(root->left);
	int rightheight = TreeHeight(root->right);

	return leftheight > rightheight ? leftheight + 1 : rightheight + 1;
}

//树第K层的节点的个数(树第K层节点的个数等于左子树第K-1层节点个数+右子树第K-1层节点个数)
int Treeksize(TreeNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}

	int left = Treeksize(root->left, k - 1);
	int right = Treeksize(root->right, k - 1);

	return left + right;
}
//二叉树查找值为x的节点
TreeNode* TreeFind(TreeNode* root, TDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}
	TreeNode* left = TreeFind(root->left, x);
	if (left)
		return left;

	return TreeFind(root->right, x);

}

//层序遍历
void  cengOrder(TreeNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		TreeNode* top = QueueTop(&q);
		QueuePop(&q);
		printf("%c ", top->data);
		if (top->left)
		{
			QueuePush(&q, top->left);
		}
		if (top->right)
		{
			QueuePush(&q, top->right);
		}
	}
	QueueDestroy(&q);
}

//判断二叉树是否是完全二叉树
bool JudgeTree(TreeNode* root)
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		TreeNode* top = QueueTop(&q);
		QueuePop(&q);
		if (top == NULL)
		{
			break;
		}
		QueuePush(top->left);
		QueuePush(top->right);
	}
	while (!QueueEmpty(&q))
	{
		if (QueueTop(&q) != NULL)
		{
			return false;
		}
		QueuePop(&q);
	}
	return true;
	QueueDestroy(&q);
}

队列头文件

#include
#include
#include
#include
//前置声明
typedef struct TreeNode* QTypeDate;
typedef struct QueueNode
{
	QTypeDate x;
	struct QueueNode* next;
}QueueNode;


typedef struct Queue
{
	QueueNode* head;
	QueueNode* tail;
	int size;
}Queue;


void QueueInit(Queue* sq);
void QueueDestroy(Queue* sq);

二叉树的头文件

#include
#include
#include
#include

//树节点的结构
typedef char TDataType;
typedef struct TreeNode
{
	TDataType data;
	struct TreeNode* left;
	struct TreeNode* right;
}TreeNode;

//树节点的创造
TreeNode* BuyNode(TDataType x);
//树的根节点
TreeNode* TreeCreate();
//树的前序遍历
void PreOrder(TreeNode* root);
//树的中序遍历
void InOrder(TreeNode* root);
//树的后序遍历
void LastOrder(TreeNode* root);
//树节点的个数
int TreeSize(TreeNode* root);
//树的高度
int TreeHeight(TreeNode* root);
//树第K层节点的个数
int Treeksize(TreeNode* root,int k);
//二叉树查找值为x的节点
TreeNode* TreeFind(TreeNode* root, TDataType x);


 

 

你可能感兴趣的:(数据结构,算法)