二叉树的结构

目录

一、二叉树的遍历

1、前序遍历:

2、中序遍历:

3、后序遍历:

4、层序遍历:

二、求结点数

三、高度

四、第k层个数


一、二叉树的遍历

 每一棵树都是由根、左子树、右子树组成,子树又可以看成根,也有其左子树,右子树……

二叉树的结构_第1张图片

    

1、前序遍历:

根->左子树->右子树

以上图为例,3的左右子树为NULL

其按前序遍历的顺序为:1 2 3 NULL NULL 4 5 NULL  NULL 6 NULL NULL 

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL");
		return;
	}
	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

2、中序遍历:

左子树->根->右子树

其中序排列顺序为:NULL 3 NULL 2 NULL 1  NULL 5 NULL 4 NULL 6 NULL

//中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

3、后序遍历:

左子树->右子树->根

其后序排列顺序为:NULL NULL 3 NULL 2 NULL NULL 5  NULL NULL 6 4 1

//后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}
	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);

}

4、层序遍历:

一层层遍历:1 2 4 3 5 6

void LevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	if (root)
		QueuePush(&q, root);
	while (!QueueEmpty(&q))
	{
		BTNode* Front = QueueFront(&q);
		QueuePop(&q);
		printf("%d ", Front->data);
		if (Front->left)
			QueuePush(&q, Front->left);
		if (Front->right)
			QueuePush(&q, Front->right);
	}
	QueueDestroy(&q);
}

二、求结点数

结点数可看成根节点加上它的左右子树的结点数

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

三、高度

每棵树的高度都可以看成是由左右子树较高的那个的高度再加1。

int TreeHeight(BTNode* 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 TreeKLevel(BTNode* root,int k)
{
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;

	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

五、查找

BTNode* BinaryTreeFind(BTNode*root,int x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;
	BTNode* lret = BinaryTreeFind(root->left,x);
	if (lret)
		return lret;
	BTNode* rret = BinaryTreeFind(root->right, x);
	if (rret)
		return rret;
}

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