二叉查找树与平衡二叉树

二叉查找树

二叉查找树的性质:对于树中的每一个节点X,它的左子树中所有关键字值小于X的关键字值,它的右子树中的所有关键字值大于X的关键字值。

二叉查找树的平均深度为O(logN),下面看一下它的相关的操作函数。

删除一个二叉树(递归形式):

void MakeEmpty(TreeNode *root)
{
	if(root == NULL)
		return;
	MakeEmpty(root->left);
	MakeEmpty(root->right)
	free(root);
}

在二叉查找树中找都某个节点:

TreeNode* Find(TreeNode *root, int x)
{
	if(root == NULL)
		return NULL;
	if(root->val > x)
		return Find(root->left, x);
	else if(root->val < x)
		return Find(root->right, x);
	else
		return root;
}

在二叉查找树中找最大值:

//递归版本
TreeNode* FindMax(TreeNode *root)
{
	if(root == NULL)
		return NULL;
	if(root->right == NULL)
		return root->right
	else
		return FindMax(root->right);
}

//迭代版本
TreeNode* FindMax(TreeNode *root)
{
	if(root == NULL)
		return NULL;
	while(root->right != NULL)
	{
		root = root->right;
	}
	retur root;
}

  在编写算法之前,首先把测试用例写好真的很重要,因为测试用例的边界值就是递归函数的出口。

二叉查找树的插入操作:

二叉查找树的插入操作很简单,因为第一个要建立的结点一定是根节点,然后每一个结点的插入肯定在叶子结点的地方。

TreeNode* Insert(TreeNode *root, int x)
{
	if(root == NULL)
	{
		root = (TreeNode*)malloc(sizeof(TreeNode));
		root->val = x;
		root->left = NULL;
		root->right = NULL;
	}
	else
	{
		if(root->val > x)
			root->left = Insert(root->left, x);
		else if(root->val < x)
			root->right = Insert(root->right, x);
	}
	return root;
}

  

  

原文地址:https://www.cnblogs.com/stemon/p/4764631.html