zoukankan      html  css  js  c++  java
  • 在最坏情况下,找到n个元素中第二小的元素需要n+lgn-2次比较

    首先两两比较找到最大的元素,需要n-1次,即二叉树的非叶子节点的个数。之后次最大的一定在和最大的元素比较过的元素中,共有lgn-1个,即树的高度。故加起来就是n+lgn-2

    
    
    #include<iostream>
    using namespace std;
    class Node
    {
    public:
        Node();
        Node(int d);
        Node*left;
        Node*right;
        int data;
    };
    Node::Node()
    {
        right = left = NULL;
    }
    Node::Node(int d)
    {
        data = d;
        right = left = NULL;
    }
    class BinaryTree
    {
    public:
        Node*root;
        void create_tree(Node**node,int len);
        int min(int a, int b);
        int search_second_small();
        BinaryTree();
    
    };
    BinaryTree::BinaryTree()
    {
        root = new Node();
    }
    int BinaryTree::min(int a, int b)
    {
        return a < b ? a : b;
    }
    void BinaryTree::create_tree(Node**node, int len)
    {
        if (len < 2)
            return;
        if (len == 2)
        {
            root->left = node[0];
            root->right = node[1];
            root->data = min(node[0]->data,node[1]->data);
        }
        else
        {
            int new_len = (len % 2) ? (len / 2 + 1) : (len / 2);
            Node**new_node = new Node*[new_len];
            int mod = len % 2;
        
            for (int i = 0; i < new_len - mod; i++)
            {
                new_node[i] = new Node(min(node[2*i]->data,node[2*i+1]->data));
                new_node[i]->left = node[2 * i];
                new_node[i]->right = node[2 * i + 1];
            }
            if (mod)
               new_node[new_len - 1] = node[len-1];
            create_tree(new_node, new_len);
            delete[] new_node;
        }
    }
    int BinaryTree::search_second_small()
    {
        Node*p = root;
        int second = 0x7fffffff;
        while (p->left&&p->right)
        {
            if (p->data == p->left->data)
            {
                if (second > p->right->data)
                    second = p->right->data;
                p = p->left;
            }
            else
            {
                if (second > p->left->data)
                    second = p->left->data;
                p = p->right;
            }
        }
        return second;
    
    }
    int main()
    {
        int arr[] = {1,3,2,4,6,0,9,8};
        int N = sizeof arr / sizeof arr[0];
        Node**node = new Node*[N];
    
        for (int i = 0; i < N; i++)
            node[i] = new Node(arr[i]);
        BinaryTree* bi_tree = new BinaryTree();
        bi_tree->create_tree(node, N);
        cout << bi_tree->root->data << endl;
        cout << bi_tree->search_second_small() << endl;
        return 0;
    
    }
    
    
    
    
    
  • 相关阅读:
    理解Python闭包,这应该是最好的例子
    2021-01-31
    论unity中UI工具与GUI函数
    2021-01-31
    第八届“图灵杯”NEUQ-ACM程序设计竞赛(全题解&&详细)
    第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛(同步赛)全题解
    Go-快速排序
    网络地址转换NAT原理及其作用
    解析私有IP地址和公网IP地址
    first blog
  • 原文地址:https://www.cnblogs.com/liuhg/p/Second_Small.html
Copyright © 2011-2022 走看看