二叉搜索树教程
二叉搜索树是一种基于节点的二叉树数据结构,具有以下特性:
- 节点的左子树只包含键小于节点键的节点。
- 节点的右子树仅包含键大于节点键的节点。
- 左右子树也必须是二叉搜索树。
不能有重复的节点。
以下是可以在 BST 上执行的各种操作:
- 在 BST 中插入一个节点:总是在叶子上插入一个新的键。开始搜索从根到叶节点的键。一旦找到叶节点,新节点就被添加为叶节点的子节点。
C++
// C++ program to insert a node
// in a BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL)
{
inorder(root->left);
cout << root->key << " ";
inorder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Inserting value 50
root = insert(root, 50);
// Inserting value 30
insert(root, 30);
// Inserting value 20
insert(root, 20);
// Inserting value 40
insert(root, 40);
// Inserting value 70
insert(root, 70);
// Inserting value 60
insert(root, 60);
// Inserting value 80
insert(root, 80);
// Print the BST
inorder(root);
return 0;
}
// This code is contributed by shubhamsingh10
C
// C program to insert a node
// in a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// inserting value 50
root = insert(root, 50);
// inserting value 30
insert(root, 30);
// inserting value 20
insert(root, 20);
// inserting value 40
insert(root, 40);
// inserting value 70
insert(root, 70);
// inserting value 60
insert(root, 60);
// inserting value 80
insert(root, 80);
// print the BST
inorder(root);
return 0;
}
C++
// C++ program to implement
// inorder traversal of BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL)
{
inorder(root->left);
cout << " " << root->key;
inorder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
inorder(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to implement
// inorder traversal of BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
inorder(root);
return 0;
}
C++
// C++ program to implement
// preorder traversal
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do preorder traversal of BST
void preOrder(struct node* root)
{
if (root != NULL) {
cout << " " << root->key;
preOrder(root->left);
preOrder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
preOrder(root);
return 0;
}
// this code is contributed by shivanisinghss2110
C
// C program to implement
// preorder traversal
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do preorder traversal of BST
void preOrder(struct node* root)
{
if (root != NULL) {
printf("%d ", root->key);
preOrder(root->left);
preOrder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
preOrder(root);
return 0;
}
C++
// C++ program to print total
// count of nodes in BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do postorder traversal of BST
void postOrder(struct node* root)
{
if (root != NULL)
{
postOrder(root->left);
postOrder(root->right);
cout << " " << root->key;
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
postOrder(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to implement
// postorder traversal
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do postorder traversal of BST
void postOrder(struct node* root)
{
if (root != NULL) {
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->key);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
postOrder(root);
return 0;
}
C++
// C++ program to implement
// level order traversal
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else {
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
cout <<" "<< root->key;
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Function to line by line print
// level order traversal a tree
void printLevelOrder(struct node* root)
{
int h = height(root);
int i;
for (i = 1; i <= h; i++) {
printGivenLevel(root, i);
cout <<"\n";
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLevelOrder(root);
return 0;
}
// this code is contributed by shivanisinghss2110
C
// C program to implement
// level order traversal
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else {
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
printf("%d ", root->key);
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Function to line by line print
// level order traversal a tree
void printLevelOrder(struct node* root)
{
int h = height(root);
int i;
for (i = 1; i <= h; i++) {
printGivenLevel(root, i);
printf("\n");
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLevelOrder(root);
return 0;
}
C++
// C++ program to print nodes
// at a given level
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
cout <<" "<< root->key;
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printGivenLevel(root, 2);
return 0;
}
// this code is contributed by shivanisinghss2110
C
// C program to print nodes
// at a given level
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
printf("%d ", root->key);
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printGivenLevel(root, 2);
return 0;
}
C++
// C++ program to print all
// leaf nodes of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print leaf nodes
// from left to right
void printLeafNodes(struct node* root)
{
// If node is null, return
if (!root)
return;
// If node is leaf node,
// print its data
if (!root->left && !root->right) {
cout <<" "<< root->key;
return;
}
// If left child exists,
// check for leaf recursively
if (root->left)
printLeafNodes(root->left);
// If right child exists,
// check for leaf recursively
if (root->right)
printLeafNodes(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLeafNodes(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print all
// leaf nodes of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print leaf nodes
// from left to right
void printLeafNodes(struct node* root)
{
// If node is null, return
if (!root)
return;
// If node is leaf node,
// print its data
if (!root->left && !root->right) {
printf("%d ", root->key);
return;
}
// If left child exists,
// check for leaf recursively
if (root->left)
printLeafNodes(root->left);
// If right child exists,
// check for leaf recursively
if (root->right)
printLeafNodes(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLeafNodes(root);
return 0;
}
C++
// C++ program to print all
// non leaf nodes of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print all non-leaf
// nodes in a tree
void printNonLeafNode(struct node* root)
{
// Base Cases
if (root == NULL
|| (root->left == NULL
&& root->right == NULL))
return;
// If current node is non-leaf,
if (root->left != NULL
|| root->right != NULL) {
cout <<" "<< root->key;
}
// If root is Not NULL and its one
// of its child is also not NULL
printNonLeafNode(root->left);
printNonLeafNode(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printNonLeafNode(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print all
// non leaf nodes of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print all non-leaf
// nodes in a tree
void printNonLeafNode(struct node* root)
{
// Base Cases
if (root == NULL
|| (root->left == NULL
&& root->right == NULL))
return;
// If current node is non-leaf,
if (root->left != NULL
|| root->right != NULL) {
printf("%d ", root->key);
}
// If root is Not NULL and its one
// of its child is also not NULL
printNonLeafNode(root->left);
printNonLeafNode(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printNonLeafNode(root);
return 0;
}
C++
// C++ program to print
// right view of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print the right view
// of a binary tree.
void rightViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the last Node of its level
if (*max_level < level) {
cout <<"\t"<< root->key;
*max_level = level;
}
// Recur for right subtree first,
// then left subtree
rightViewUtil(root->right, level + 1,
max_level);
rightViewUtil(root->left, level + 1,
max_level);
}
// Wrapper over rightViewUtil()
void rightView(struct node* root)
{
int max_level = 0;
rightViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
rightView(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print
// right view of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print the right view
// of a binary tree.
void rightViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the last Node of its level
if (*max_level < level) {
printf("%d\t", root->key);
*max_level = level;
}
// Recur for right subtree first,
// then left subtree
rightViewUtil(root->right, level + 1,
max_level);
rightViewUtil(root->left, level + 1,
max_level);
}
// Wrapper over rightViewUtil()
void rightView(struct node* root)
{
int max_level = 0;
rightViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
rightView(root);
return 0;
}
C++
// C++ program to print
// left view of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print left view of
// binary tree
void leftViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the first node
// of its level
if (*max_level < level) {
cout <<" "<< root->key;
*max_level = level;
}
// Recur for left and right subtrees
leftViewUtil(root->left, level + 1,
max_level);
leftViewUtil(root->right, level + 1,
max_level);
}
// Wrapper over leftViewUtil()
void leftView(struct node* root)
{
int max_level = 0;
leftViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
leftView(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print
// left view of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print left view of
// binary tree
void leftViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the first node
// of its level
if (*max_level < level) {
printf("%d\t", root->key);
*max_level = level;
}
// Recur for left and right subtrees
leftViewUtil(root->left, level + 1,
max_level);
leftViewUtil(root->right, level + 1,
max_level);
}
// Wrapper over leftViewUtil()
void leftView(struct node* root)
{
int max_level = 0;
leftViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
leftView(root);
return 0;
}
C++
// C++ program to print
// height of a BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else
{
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
cout << " " << height(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print
// height of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else {
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printf("%d", height(root));
return 0;
}
C++
// C++ program to delete
// a node of BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
cout <<" "<< root->key;
inorder(root->right);
}
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Function that deletes the key and
// returns the new root
struct node* deleteNode(struct node* root,
int key)
{
// base Case
if (root == NULL)
return root;
// If the key to be deleted is
// smaller than the root's key,
// then it lies in left subtree
if (key < root->key) {
root->left
= deleteNode(root->left, key);
}
// If the key to be deleted is
// greater than the root's key,
// then it lies in right subtree
else if (key > root->key) {
root->right
= deleteNode(root->right, key);
}
// If key is same as root's key,
// then this is the node
// to be deleted
else {
// Node with only one child
// or no child
if (root->left == NULL) {
struct node* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL) {
struct node* temp = root->left;
free(root);
return temp;
}
// Node with two children:
// Get the inorder successor(smallest
// in the right subtree)
struct node* temp = minValueNode(root->right);
// Copy the inorder successor's
// content to this node
root->key = temp->key;
// Delete the inorder successor
root->right
= deleteNode(root->right, temp->key);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
root = deleteNode(root, 60);
inorder(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to delete
// a node of BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Function that deletes the key and
// returns the new root
struct node* deleteNode(struct node* root,
int key)
{
// base Case
if (root == NULL)
return root;
// If the key to be deleted is
// smaller than the root's key,
// then it lies in left subtree
if (key < root->key) {
root->left
= deleteNode(root->left, key);
}
// If the key to be deleted is
// greater than the root's key,
// then it lies in right subtree
else if (key > root->key) {
root->right
= deleteNode(root->right, key);
}
// If key is same as root's key,
// then this is the node
// to be deleted
else {
// Node with only one child
// or no child
if (root->left == NULL) {
struct node* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL) {
struct node* temp = root->left;
free(root);
return temp;
}
// Node with two children:
// Get the inorder successor(smallest
// in the right subtree)
struct node* temp = minValueNode(root->right);
// Copy the inorder successor's
// content to this node
root->key = temp->key;
// Delete the inorder successor
root->right
= deleteNode(root->right, temp->key);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
root = deleteNode(root, 60);
inorder(root);
return 0;
}
C++
// C++ program print smallest
// element of BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
cout <<" "<< minValueNode(root)->key;
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program print smallest
// element of BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printf("%d", minValueNode(root)->key);
return 0;
}
C++
// C++ program to print total
// count of nodes in BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to get the total count of
// nodes in a binary tree
int nodeCount(struct node* node)
{
if (node == NULL)
return 0;
else
return nodeCount(node->left)
+ nodeCount(node->right) + 1;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
cout <<" "<< nodeCount(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print total
// count of nodes in BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to get the total count of
// nodes in a binary tree
int nodeCount(struct node* node)
{
if (node == NULL)
return 0;
else
return nodeCount(node->left)
+ nodeCount(node->right) + 1;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printf("%d", nodeCount(root));
return 0;
}
C++
// C++ program to delete a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
cout<< " "<< root->key;
inorder(root->right);
}
}
// Function to delete the BST
struct node* emptyBST(struct node* root)
{
struct node* temp;
if (root != NULL) {
// Traverse to left subtree
emptyBST(root->left);
// Traverse to right subtree
emptyBST(root->right);
cout<<"\nReleased node:"<< root->key;
temp = root;
// Require for free memory
free(temp);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
cout<<"BST before deleting:\n";
inorder(root);
// Function Call
root = emptyBST(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to delete a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Function to delete the BST
struct node* emptyBST(struct node* root)
{
struct node* temp;
if (root != NULL) {
// Traverse to left subtree
emptyBST(root->left);
// Traverse to right subtree
emptyBST(root->right);
printf("Released node:%d \n", root->key);
temp = root;
// Require for free memory
free(temp);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
printf("BST before deleting:\n");
inorder(root);
// Function Call
root = emptyBST(root);
return 0;
}
输出:
20 30 40 50 60 70 80
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 中序遍历:在二叉搜索树 (BST) 的情况下,中序遍历以非递减顺序给出节点。
C++
// C++ program to implement
// inorder traversal of BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL)
{
inorder(root->left);
cout << " " << root->key;
inorder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
inorder(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to implement
// inorder traversal of BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
inorder(root);
return 0;
}
输出:
20 30 40 50 60 70 80
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 前序遍历:先序遍历先访问根节点,然后遍历左右子树。它用于创建树的副本。前序遍历也用于获取表达式树的前缀表达式。
C++
// C++ program to implement
// preorder traversal
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do preorder traversal of BST
void preOrder(struct node* root)
{
if (root != NULL) {
cout << " " << root->key;
preOrder(root->left);
preOrder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
preOrder(root);
return 0;
}
// this code is contributed by shivanisinghss2110
C
// C program to implement
// preorder traversal
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do preorder traversal of BST
void preOrder(struct node* root)
{
if (root != NULL) {
printf("%d ", root->key);
preOrder(root->left);
preOrder(root->right);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
preOrder(root);
return 0;
}
输出:
50 30 20 40 70 60 80
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 后序遍历:后序遍历首先遍历左右子树,然后访问根节点。它用于删除树。
C++
// C++ program to print total
// count of nodes in BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do postorder traversal of BST
void postOrder(struct node* root)
{
if (root != NULL)
{
postOrder(root->left);
postOrder(root->right);
cout << " " << root->key;
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
postOrder(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to implement
// postorder traversal
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do postorder traversal of BST
void postOrder(struct node* root)
{
if (root != NULL) {
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->key);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
postOrder(root);
return 0;
}
输出:
20 40 30 60 80 70 50
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 层序遍历:BST 的层序遍历是树的广度优先遍历。它首先访问特定级别的所有节点,然后再移动到下一个级别。
C++
// C++ program to implement
// level order traversal
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else {
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
cout <<" "<< root->key;
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Function to line by line print
// level order traversal a tree
void printLevelOrder(struct node* root)
{
int h = height(root);
int i;
for (i = 1; i <= h; i++) {
printGivenLevel(root, i);
cout <<"\n";
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLevelOrder(root);
return 0;
}
// this code is contributed by shivanisinghss2110
C
// C program to implement
// level order traversal
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else {
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
printf("%d ", root->key);
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Function to line by line print
// level order traversal a tree
void printLevelOrder(struct node* root)
{
int h = height(root);
int i;
for (i = 1; i <= h; i++) {
printGivenLevel(root, i);
printf("\n");
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLevelOrder(root);
return 0;
}
输出:
50
30 70
20 40 60 80
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 打印给定级别的节点:它打印 BST 特定级别的所有节点。
C++
// C++ program to print nodes
// at a given level
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
cout <<" "<< root->key;
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printGivenLevel(root, 2);
return 0;
}
// this code is contributed by shivanisinghss2110
C
// C program to print nodes
// at a given level
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Print nodes at a given level
void printGivenLevel(struct node* root,
int level)
{
if (root == NULL)
return;
if (level == 1)
printf("%d ", root->key);
else if (level > 1) {
// Recursive Call
printGivenLevel(root->left, level - 1);
printGivenLevel(root->right, level - 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printGivenLevel(root, 2);
return 0;
}
输出:
30 70
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 打印所有叶节点:如果一个节点的左右子节点都为 NULL,则该节点为叶节点。
C++
// C++ program to print all
// leaf nodes of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print leaf nodes
// from left to right
void printLeafNodes(struct node* root)
{
// If node is null, return
if (!root)
return;
// If node is leaf node,
// print its data
if (!root->left && !root->right) {
cout <<" "<< root->key;
return;
}
// If left child exists,
// check for leaf recursively
if (root->left)
printLeafNodes(root->left);
// If right child exists,
// check for leaf recursively
if (root->right)
printLeafNodes(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLeafNodes(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print all
// leaf nodes of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print leaf nodes
// from left to right
void printLeafNodes(struct node* root)
{
// If node is null, return
if (!root)
return;
// If node is leaf node,
// print its data
if (!root->left && !root->right) {
printf("%d ", root->key);
return;
}
// If left child exists,
// check for leaf recursively
if (root->left)
printLeafNodes(root->left);
// If right child exists,
// check for leaf recursively
if (root->right)
printLeafNodes(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printLeafNodes(root);
return 0;
}
输出:
20 40 60 80
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 打印所有非叶节点:如果节点的左子节点或右子节点不为 NULL,则该节点是非叶节点。
C++
// C++ program to print all
// non leaf nodes of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print all non-leaf
// nodes in a tree
void printNonLeafNode(struct node* root)
{
// Base Cases
if (root == NULL
|| (root->left == NULL
&& root->right == NULL))
return;
// If current node is non-leaf,
if (root->left != NULL
|| root->right != NULL) {
cout <<" "<< root->key;
}
// If root is Not NULL and its one
// of its child is also not NULL
printNonLeafNode(root->left);
printNonLeafNode(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printNonLeafNode(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print all
// non leaf nodes of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print all non-leaf
// nodes in a tree
void printNonLeafNode(struct node* root)
{
// Base Cases
if (root == NULL
|| (root->left == NULL
&& root->right == NULL))
return;
// If current node is non-leaf,
if (root->left != NULL
|| root->right != NULL) {
printf("%d ", root->key);
}
// If root is Not NULL and its one
// of its child is also not NULL
printNonLeafNode(root->left);
printNonLeafNode(root->right);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printNonLeafNode(root);
return 0;
}
输出:
50 30 70
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- BST 的右视图:二叉搜索树的右视图是从右侧访问树时可见的节点集。
C++
// C++ program to print
// right view of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print the right view
// of a binary tree.
void rightViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the last Node of its level
if (*max_level < level) {
cout <<"\t"<< root->key;
*max_level = level;
}
// Recur for right subtree first,
// then left subtree
rightViewUtil(root->right, level + 1,
max_level);
rightViewUtil(root->left, level + 1,
max_level);
}
// Wrapper over rightViewUtil()
void rightView(struct node* root)
{
int max_level = 0;
rightViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
rightView(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print
// right view of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print the right view
// of a binary tree.
void rightViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the last Node of its level
if (*max_level < level) {
printf("%d\t", root->key);
*max_level = level;
}
// Recur for right subtree first,
// then left subtree
rightViewUtil(root->right, level + 1,
max_level);
rightViewUtil(root->left, level + 1,
max_level);
}
// Wrapper over rightViewUtil()
void rightView(struct node* root)
{
int max_level = 0;
rightViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
rightView(root);
return 0;
}
输出:
50 70 80
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- BST 的左视图:二叉搜索树的左视图是从左侧访问树时可见的节点集。
C++
// C++ program to print
// left view of a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print left view of
// binary tree
void leftViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the first node
// of its level
if (*max_level < level) {
cout <<" "<< root->key;
*max_level = level;
}
// Recur for left and right subtrees
leftViewUtil(root->left, level + 1,
max_level);
leftViewUtil(root->right, level + 1,
max_level);
}
// Wrapper over leftViewUtil()
void leftView(struct node* root)
{
int max_level = 0;
leftViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
leftView(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print
// left view of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to print left view of
// binary tree
void leftViewUtil(struct node* root,
int level,
int* max_level)
{
// Base Case
if (root == NULL)
return;
// If this is the first node
// of its level
if (*max_level < level) {
printf("%d\t", root->key);
*max_level = level;
}
// Recur for left and right subtrees
leftViewUtil(root->left, level + 1,
max_level);
leftViewUtil(root->right, level + 1,
max_level);
}
// Wrapper over leftViewUtil()
void leftView(struct node* root)
{
int max_level = 0;
leftViewUtil(root, 1, &max_level);
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
leftView(root);
return 0;
}
输出:
50 30 20
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- BST的高度:使用节点左右子树的高度递归计算,并为节点分配高度为两个孩子的高度的最大值加1。
C++
// C++ program to print
// height of a BST
#include
using namespace std;
// Given Node node
struct node
{
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp = (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key)
{
node->left = insert(node->left, key);
}
else if (key > node->key)
{
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else
{
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
cout << " " << height(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print
// height of a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Returns height of the BST
int height(struct node* node)
{
if (node == NULL)
return 0;
else {
// Compute the depth of each subtree
int lDepth = height(node->left);
int rDepth = height(node->right);
// Use the larger one
if (lDepth > rDepth)
return (lDepth + 1);
else
return (rDepth + 1);
}
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printf("%d", height(root));
return 0;
}
输出:
3
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- 删除 BST 的节点:用于从 BST 中删除具有特定 key 的节点并返回新的 BST。
C++
// C++ program to delete
// a node of BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
cout <<" "<< root->key;
inorder(root->right);
}
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Function that deletes the key and
// returns the new root
struct node* deleteNode(struct node* root,
int key)
{
// base Case
if (root == NULL)
return root;
// If the key to be deleted is
// smaller than the root's key,
// then it lies in left subtree
if (key < root->key) {
root->left
= deleteNode(root->left, key);
}
// If the key to be deleted is
// greater than the root's key,
// then it lies in right subtree
else if (key > root->key) {
root->right
= deleteNode(root->right, key);
}
// If key is same as root's key,
// then this is the node
// to be deleted
else {
// Node with only one child
// or no child
if (root->left == NULL) {
struct node* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL) {
struct node* temp = root->left;
free(root);
return temp;
}
// Node with two children:
// Get the inorder successor(smallest
// in the right subtree)
struct node* temp = minValueNode(root->right);
// Copy the inorder successor's
// content to this node
root->key = temp->key;
// Delete the inorder successor
root->right
= deleteNode(root->right, temp->key);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
root = deleteNode(root, 60);
inorder(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to delete
// a node of BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Function that deletes the key and
// returns the new root
struct node* deleteNode(struct node* root,
int key)
{
// base Case
if (root == NULL)
return root;
// If the key to be deleted is
// smaller than the root's key,
// then it lies in left subtree
if (key < root->key) {
root->left
= deleteNode(root->left, key);
}
// If the key to be deleted is
// greater than the root's key,
// then it lies in right subtree
else if (key > root->key) {
root->right
= deleteNode(root->right, key);
}
// If key is same as root's key,
// then this is the node
// to be deleted
else {
// Node with only one child
// or no child
if (root->left == NULL) {
struct node* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL) {
struct node* temp = root->left;
free(root);
return temp;
}
// Node with two children:
// Get the inorder successor(smallest
// in the right subtree)
struct node* temp = minValueNode(root->right);
// Copy the inorder successor's
// content to this node
root->key = temp->key;
// Delete the inorder successor
root->right
= deleteNode(root->right, temp->key);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
root = deleteNode(root, 60);
inorder(root);
return 0;
}
输出:
20 30 40 50 70 80
时间复杂度: O(log N),其中 N 是 BST 的节点数
辅助空间: O(1)
- BST的最小节点:用于返回BST中值最小的节点。
C++
// C++ program print smallest
// element of BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
cout <<" "<< minValueNode(root)->key;
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program print smallest
// element of BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function that returns the node with minimum
// key value found in that tree
struct node* minValueNode(struct node* node)
{
struct node* current = node;
// Loop down to find the leftmost leaf
while (current && current->left != NULL)
current = current->left;
return current;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printf("%d", minValueNode(root)->key);
return 0;
}
输出:
20
时间复杂度: O(log N),其中 N 是 BST 的节点数
辅助空间: O(1)
- BST 中的节点总数:该函数返回 BST 中的节点总数。
C++
// C++ program to print total
// count of nodes in BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to get the total count of
// nodes in a binary tree
int nodeCount(struct node* node)
{
if (node == NULL)
return 0;
else
return nodeCount(node->left)
+ nodeCount(node->right) + 1;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
cout <<" "<< nodeCount(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to print total
// count of nodes in BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to get the total count of
// nodes in a binary tree
int nodeCount(struct node* node)
{
if (node == NULL)
return 0;
else
return nodeCount(node->left)
+ nodeCount(node->right) + 1;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
// Function Call
printf("%d", nodeCount(root));
return 0;
}
输出:
7
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)
- Delete a BST:用于彻底删除BST并释放内存。
C++
// C++ program to delete a BST
#include
using namespace std;
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
cout<< " "<< root->key;
inorder(root->right);
}
}
// Function to delete the BST
struct node* emptyBST(struct node* root)
{
struct node* temp;
if (root != NULL) {
// Traverse to left subtree
emptyBST(root->left);
// Traverse to right subtree
emptyBST(root->right);
cout<<"\nReleased node:"<< root->key;
temp = root;
// Require for free memory
free(temp);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
cout<<"BST before deleting:\n";
inorder(root);
// Function Call
root = emptyBST(root);
return 0;
}
// This code is contributed by shivanisinghss2110
C
// C program to delete a BST
#include
#include
// Given Node node
struct node {
int key;
struct node *left, *right;
};
// Function to create a new BST node
struct node* newNode(int item)
{
struct node* temp
= (struct node*)malloc(
sizeof(struct node));
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
// Function to insert a new node with
// given key in BST
struct node* insert(struct node* node, int key)
{
// If the tree is empty, return a new node
if (node == NULL)
return newNode(key);
// Otherwise, recur down the tree
if (key < node->key) {
node->left = insert(node->left, key);
}
else if (key > node->key) {
node->right = insert(node->right, key);
}
// Return the node pointer
return node;
}
// Function to do inorder traversal of BST
void inorder(struct node* root)
{
if (root != NULL) {
inorder(root->left);
printf("%d ", root->key);
inorder(root->right);
}
}
// Function to delete the BST
struct node* emptyBST(struct node* root)
{
struct node* temp;
if (root != NULL) {
// Traverse to left subtree
emptyBST(root->left);
// Traverse to right subtree
emptyBST(root->right);
printf("Released node:%d \n", root->key);
temp = root;
// Require for free memory
free(temp);
}
return root;
}
// Driver Code
int main()
{
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
*/
struct node* root = NULL;
// Creating the BST
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
printf("BST before deleting:\n");
inorder(root);
// Function Call
root = emptyBST(root);
return 0;
}
输出:
BST before deleting:
20 30 40 50 60 70 80
Released node:20
Released node:40
Released node:30
Released node:60
Released node:80
Released node:70
Released node:50
时间复杂度: O(N),其中 N 是 BST 的节点数
辅助空间: O(1)