zoukankan      html  css  js  c++  java
  • 带有父节点的二叉查找树实现

    看来得要个父节点,因为后面的红黑树很需要啊!!

    代码
    #include <iostream>
    using namespace std;
    struct tree
    {
    int data;
    tree
    *left,*right,*parent;
    };
    void tree_insert(tree *&, int);
    //二叉查找树的初始化构建
    void tree_init(tree *&T)
    {
    cout
    << "please input numbers of tree until the input is invalid" << endl;
    int data = 0;
    while (cin >> data)
    {
    tree_insert(T, data);
    }
    }
    //插入
    void tree_insert(tree * &T,int value)
    {
    if (T == NULL)
    {
    T
    = new tree();
    T
    ->data = value;
    T
    ->left = T->right = T->parent = NULL;
    }
    else
    {
    if (T->data > value)
    {
    tree_insert(T
    ->left, value);
    if (T->left)
    T
    ->left->parent = T;
    }
    else
    {
    tree_insert(T
    ->right, value);
    if (T->right)
    T
    ->right->parent = T;
    }
    }
    }
    //preorder to print the data of the whole tree
    void tree_print1(tree *T)
    {
    if (T != NULL)
    {
    tree_print1(T
    ->left);
    cout
    << T->data << " ";
    tree_print1(T
    ->right);
    }
    }
    //中序遍历
    void tree_print2(tree *T)
    {
    if (T != NULL)
    {
    tree_print2(T
    ->right);
    cout
    << T->data << " " ;
    tree_print2(T
    ->left);
    }
    }
    //后序遍历
    void tree_print3(tree *T)
    {
    if (T != NULL)
    {
    cout
    << T->data << " ";
    tree_print3(T
    ->left);
    tree_print3(T
    ->right);
    }
    }
    //find a value in the tree with the method of recursion
    bool tree_search(tree *T, int value)
    {
    tree
    *t = T;
    while (t != NULL)
    {
    if (t->data == value)
    {
    return true;
    }
    if(t->data < value)
    t
    = t->right;
    else
    t
    = t->left;
    }
    return false;
    }
    //求最小值
    tree * tree_mininum(tree *T)
    {
    while (T && T->left)
    {
    T
    = T->left;
    }
    return T;
    }
    //求后继结点
    tree *tree_successor(tree *T)
    {
    if (!T->right)
    {
    return tree_mininum(T->right);
    }
    tree
    *y = T->parent;
    while(y && T == y->right)
    {
    T
    = y;
    y
    = y->parent;
    }
    return y;
    }
    //删除节点,不考虑性质
    void del1(tree *&t)
    {
    if (t == t->parent->left)
    {
    if(!t->left && !t->right)
    t
    ->parent->left = NULL;
    if(t->left != NULL)
    t
    ->parent->left = t->left;
    if(t->right != NULL)
    t
    ->parent->left = t->right;
    }
    else
    {
    if(!t->left && !t->right)
    t
    ->parent->right = NULL;
    if(t->left != NULL)
    t
    ->parent->right= t->left;
    if(t->right != NULL)
    t
    ->parent->right = t->right;
    }
    }
    //删除任意节点,并保持二叉查找树的性质
    void tree_del(tree *T)
    {
    tree
    *y = NULL;
    if (T->left == NULL || T->right == NULL)
    {
    y
    = T;
    del1(T);
    }
    else
    {
    y
    = tree_successor(T);
    T
    ->data = y->data;
    del1(y);
    }

    }

    int main()
    {
    tree
    *T = NULL;
    tree_init(T);
    cout
    << "The number in the tree is :" << endl;
    tree_print1(T);
    cout
    << endl;
    tree_print2(T);
    cout
    << endl;
    tree_print3(T);
    int find_value = 0;
    //cout << endl << "please input the number you want to find" <<endl;
    cin.clear();
    //cin >> find_value;
    //cout << tree_search(T,find_value) << endl;
    int del_data = 0;
    cin
    >> del_data;
    tree_del(T);
    }
  • 相关阅读:
    各种工具的使用 tricks
    各种工具的使用 tricks
    全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
    全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
    CSS(网页样式语言)基础
    CSS(网页样式语言)基础
    辨异 —— 机器学习概念辨异、模型理解
    辨异 —— 机器学习概念辨异、模型理解
    程序猿/媛段子
    tabhost中activity跳转动画不显示的解决办法
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/1897241.html
Copyright © 2011-2022 走看看