ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

树数据结构教程5. C ++中的BST实现

前开发者教程 六月15,2019

在二进制搜索树上实施以下操作

  1. 插入操作
  2. 找到敏
  3. 寻找最大
  4. 有序遍历
  5. 预购遍历
  6. 订单遍历
  7. 获取树的高度
  8. 检查树是否是平衡树
  9. 使用给定密钥删除节点
  10. 查找给定的密钥

C ++解决方案

#include<iostream>
#include<vector>
#include<string>

using namespace std;


struct Node
{
    int data;
    Node *left;
    Node *right;
};

//global root declaration
Node *root;

Node* insert(int num, Node* root)
{
    if(root == NULL)
    {
        root = new Node;
        root->data = num;
        root->left = root->right = NULL;
    }
    else if(num < root->data)
        root->left = insert(num, root->left);

    else if(num > root->data)
        root->right = insert(num, root->right);
    return root;
}

Node* findMax(Node* root)
{
    if(root == NULL)
        return NULL;
    else if(root->right == NULL)
        return root;
    else
        return findMax(root->right);
}

Node* findMin(Node* root)
{
    if(root == NULL)
        return NULL;
    else if(root->left == NULL)
        return root;
    else
        return findMin(root->left);
}

void inorder(Node *root)
{
    if(root == NULL)
        return;
    inorder(root->left);
    cout << root->data << " ";
    inorder(root->right);
}

void preOrder(Node *root)
{
        if (!root)
                return;
        cout << root->data << " ";
        preOrder(root->left);
        preOrder(root->right);
}
void postOrder(Node *root)
{
        if (!root)
                return;
        postOrder(root->left);
        postOrder(root->right);
        cout << root->data << " ";
}

int getHeight(Node *root)
{
        if (!root)
                return 0;
        return 1 + max(getHeight(root->left) , getHeight(root->right));
}

bool isBalanced(Node *root)
{
        if (!root)
                return false;
        int leftHeight = getHeight(root->left);
        int rightHeight = getHeight(root->right);

        if (abs(leftHeight - rightHeight) > 1)
                return false;
        return true;
}

Node* makeEmpty(Node *root)
{
    if(root == NULL)
        return NULL;
    {
        makeEmpty(root->left);
        makeEmpty(root->right);
        delete root;
    }
    return NULL;
}

Node* remove(Node* node, int key)
{
   Node* temp;
    if(node == NULL)
        return NULL;
    else if(key < node->data)
        node->left = remove(node->left, key);
    else if(key > node->data)
        node->right = remove(node->right, key);
    else if(node->left && node->right)
    {
        temp = findMin(node->right);
        node->data = temp->data;
        node->right = remove(node->right, node->data);
    }
    else
    {
        temp = node;
        if(node->left == NULL)
            node = node->right;
        else if(node->right == NULL)
            node = node->left;
        delete temp;
    }

    return node;
}

Node* find(Node *root, int key)
{
    if(root == NULL)
        return NULL;
    else if(key < root->data)
        return find(root->left, key);
    else if(key > root->data)
        return find(root->right, key);
    else
        return root;
}

int main()
{
    root = insert(10, root);
    root = insert(30, root);
    root = insert(20, root);
    root = insert(50, root);
    root = insert(60, root);
    root = insert(25, root);
    root = insert(15, root);

    cout<<"\nThe values displayed using inorder traversal = "<<endl;
    inorder(root); 

    cout<<"\nThe values displayed using preOrder traversal = "<<endl;
    preOrder(root); 

    cout<<"\nThe values displayed using postOrder traversal = "<<endl;
    postOrder(root); 

    Node *max_value = findMax(root);
    cout<<"\n\nThe maximum value is "<< max_value->data <<endl;
    
    Node *min_value = findMin(root);
    cout<<"\nThe minumim value is "<< min_value->data <<endl;

    cout<<"\nThe height of the tree is = "<< getHeight(root)<<endl;

    if(isBalanced(root))
    	cout<<"\nThe tree is balanced"<<endl;
    else
    	cout<<"\nThe tree not is balanced"<<endl;


    int key = 60;

    if(find(root, key) != NULL)
    	cout<<"\nThe key "<<key<<" is present\n"<<endl;
    else
      	cout<<"\nThe key "<<key<<" is not present\n"<<endl;

   	remove(root, key);
    cout<<"\nThe key  "<<key<<" has been deleted"<<endl;

    cout<<"\nThe values displayed using inorder traversal = "<<endl;
    inorder(root); 
    cout<<endl;

	return 0;
  	
}

输出:

The values displayed using inorder traversal =
10 15 20 25 30 50 60

The values displayed using preOrder traversal =
10 30 20 15 25 50 60

The values displayed using postOrder traversal =
15 25 20 60 50 30 10

The maximum value is 60

The minumim value is 10

The height of the tree is = 4

The tree not is balanced

The key 60 is present


The key  60 has been deleted

The values displayed using inorder traversal =
10 15 20 25 30 50

进一步阅读:

AJ关于DS和算法的权威指南。单击此处以学习算法和数据结构教程的完整列表。 85多个章节可供学习。

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节最常见的编码问题
5G NR 50+章Linux系统编程20+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的



      1. <i class="LRY9hm7"><object id="DiF3OGJ" class="D2DX8RI"></object></i>

        <datalist id="Zkwpz9l"><map class="V6k2ezN"><form class="MGqvegb"></form></map></datalist>

        • <time id="J1Mkyb4"></time>

          <meter id="lU7dZgR" class="lFz1JB0"><fieldset id="fKpqioo"></fieldset></meter>