zoukankan      html  css  js  c++  java
  • 二叉搜索树

    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<stdlib.h>
    using namespace std;
    struct TreeNode
    {
        TreeNode* p;
        TreeNode* l;
        TreeNode* r;
        int key;
        TreeNode()
        {
            p = 0;
            l = 0;
            r = 0;
            key = -1;
        }
    };
    const int RANDMOD = 300;
    const int MAX = 10;
    TreeNode* root = new TreeNode;
    int tIndex = 0;
    int a[MAX];
    int getRandom()
    {
        return rand() % RANDMOD;
    }
    
    /**
     * 中序遍历
     */
    void inOrder(TreeNode* root)
    {
        if(root == NULL)
            return;
        inOrder(root->l);
        cout << root->key << " ";
        inOrder(root->r);
    }
    /**
     * 插入一个结点,等于在左子树
     */
    void insertNode(int key)
    {
        if(root->key == -1)
        {
            root->key = key;
            return;
        }
        TreeNode* p = root;
        TreeNode* pc = 0;
        while (p != NULL)
        {
            pc = p;
            if(key <= p->key)
                p = p->l;
            else
                p = p->r;
        }
        TreeNode* newNode = new TreeNode;
        newNode->key = key;
        newNode->p = pc;
        if(key <= pc->key)
            pc->l = newNode;
        else
            pc->r = newNode;
    }
    
    /**
     * 查找root->key=key的结点
     */
    TreeNode* findNode(TreeNode* root, int key)
    {
        if(root->key == key)
            return root;
        if(key <= root->key)
            return findNode(root->l, key);
        else
            return findNode(root->r, key);
        return 0;
    }
    
    /**
     * 查找以该结点为根的最小key的结点
     */
    TreeNode* minNode(TreeNode* node)
    {
        while (node->l != NULL)
            node = node->l;
        return node;
    }
    
    /**
     * 查找以该结点为根的最大key的结点
     */
    TreeNode* maxNode(TreeNode* node)
    {
        while (node->r != NULL)
            node = node->r;
        return node;
    }
    /**
     * z结点的后继结点 y
     * y.key > z.key && y2.key>y.key
     */
    TreeNode* afterNode(TreeNode* zNode)
    {
        if(zNode->r != NULL)
            return minNode(zNode->r);
        TreeNode* y = zNode->p;
        while (y != NULL && zNode == y->r)
        {
            zNode = y;
            y = y->p;
        }
        //不存在返回NULL
        return y;
    }
    
    /**
     *用v为根的结点替换u为根的子树
     */
    void transplant(TreeNode* u, TreeNode* v)
    {
        //树根
        if(u->p == NULL)
            root = v;
        else if(u == u->p->l)
        {
            u->p->l = v;
        }
        else
            u->p->r = v;
        if(v != NULL)
            v->p = u->p;
    }
    void deleteNode(TreeNode* zNode)
    {
        if(zNode->l == NULL)
            transplant(zNode, zNode->r);
        else if(zNode->r == NULL)
            transplant(zNode, zNode->l);
        else
        {
            TreeNode* y = minNode(zNode->r);
            if(y->p != zNode)
            {
                transplant(y, y->r);
                y->r = zNode->r;
                y->r->p = y;
            }
            transplant(zNode, y);
            y->l = zNode->l;
            y->l->p = y;
        }
    }
    int main()
    {
        /**
         * 二叉搜索树,左子树的所有结点小于等于根结点,右子树的所有结点大于根节点
         */
        for(int i = 0; i < MAX; i++)
        {
            int k = getRandom();
            a[i] = k;
            insertNode(k);
        }
        for(int i = 0; i < MAX; i++)
            cout << a[i] << " ";
        cout << endl;
        inOrder(root);
        cout << endl;
        cout << "最大值" << maxNode(root)->key << endl;
        cout << "最小值" << minNode(root)->key << endl;
        TreeNode* zNode = findNode(root, a[tIndex]);
        TreeNode* aNode = afterNode(zNode);
        if(aNode != NULL)
            cout << a[tIndex] << "的后继结点" << aNode->key << endl;
        else
            cout << a[tIndex] << "没有后继结点" << endl;
        //TODO删除一个结点
        cout << "删除结点" << a[tIndex] << endl;
        deleteNode(zNode);
        inOrder(root);
        return 0;
    }
  • 相关阅读:
    HDU 2955 Robberies
    CodeForces 429B Working out DP
    Lweb and String 超级大水题
    A water problem 大数取余。
    Danganronpa 水题。
    HDU 2018 DP
    Git分支管理
    linux相关操作命令
    项目部署相关命令(pm2)
    ubantu16.04安装sougou输入法
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/6935406.html
Copyright © 2011-2022 走看看