二叉排序树的创建
二叉排序树中增加和删除关键字
判别是否是二叉排序树
二叉排序树的最大值和第k大的值
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode
{
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode *createNode(int value)
{
TreeNode *newNode = (TreeNode *)malloc(sizeof(TreeNode));
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
TreeNode *insert(TreeNode *root, int value)
{
if (root == NULL)
{
return createNode(value);
}
if (value < root->data)
{
root->left = insert(root->left, value);
}
else if (value > root->data)
{
root->right = insert(root->right, value);
}
return root;
}
TreeNode *findMin(TreeNode *node)
{
while (node->left != NULL)
{
node = node->left;
}
return node;
}
TreeNode *deleteNode(TreeNode *root, int value)
{
if (root == NULL)
{
return root;
}
if (value < root->data)
{
root->left = deleteNode(root->left, value);
}
else if (value > root->data)
{
root->right = deleteNode(root->right, value);
}
else
{
if (root->left == NULL)
{
TreeNode *temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL)
{
TreeNode *temp = root->left;
free(root);
return temp;
}
TreeNode *temp = findMin(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
return root;
}
int isBSTUtil(TreeNode *node, int min, int max)
{
if (node == NULL)
{
return 1;
}
if (node->data <= min || node->data >= max)
{
return 0;
}
return isBSTUtil(node->left, min, node->data) && isBSTUtil(node->right, node->data, max);
}
int isBST(TreeNode *root)
{
return isBSTUtil(root, INT_MIN, INT_MAX);
}
int findMax(TreeNode *root)
{
if (root == NULL)
{
printf("树为空\n");
return -1;
}
while (root->right != NULL)
{
root = root->right;
}
return root->data;
}
void inorderTraversal(TreeNode *root, int k, int *count, int *result)
{
if (root == NULL || *count >= k)
{
return;
}
inorderTraversal(root->right, k, count, result);
(*count)++;
if (*count == k)
{
*result = root->data;
return;
}
inorderTraversal(root->left, k, count, result);
}
int findKthLargest(TreeNode *root, int k)
{
int count = 0;
int result = -1;
inorderTraversal(root, k, &count, &result);
return result;
}