• HDU 3999 The order of a Tree


    The order of a Tree

      As we know,the shape of a binary search tree is greatly related to the order of keys we insert. To be precisely: 
      1.  insert a key k to a empty tree, then the tree become a tree with only one node;  
      2.  insert a key k to a nonempty tree, if k is less than the root ,insert it to the left sub-tree;else insert k to the right sub-tree. 
      We call the order of keys we insert “the order of a tree”,your task is,given a oder of a tree, find the order of a tree with the least lexicographic order that generate the same tree.Two trees are the same if and only if they have the same shape. 

    Input 

     There are multiple test cases in an input file. The first line of each testcase is an integer n(n <= 100,000),represent the number of nodes.The second line has n intergers,k1 to kn,represent the order of a tree.To make if more simple, k1 to kn is a sequence of 1 to n. 

    Output

     One line with n intergers, which are the order of a tree that generate the same tree with the least lexicographic. 
    Sample Input

    4
    
    1 3 4 2

    Sample Output

    1 3 2 4

    解题思路:
      本题给出多组数据每组数据包括结点数量和结点权值,要求以输入的权值建立二叉搜索树,并输出可以建立同样二叉搜索树且字典序最小的一组数据,根据二叉搜索树的性质我们可以发现,最小的字典序就是二叉搜索树的前序遍历。我们只需要输出二叉搜索树的前序遍历即可。

    #include <bits/stdc++.h>
    using namespace std;
    typedef int dataTpye;
    vector<dataTpye> str;
    struct node{
        dataTpye data;
        node *leftChild;
        node *rightChild;
        node(){
            leftChild = NULL;
            rightChild = NULL;
        }
    };
    void insertBST(node *&root, dataTpye x){//二叉搜索树插入函数
        if(root == NULL){   //找到空位置即使插入位置
            root = new node();  //新建结点权值为x
            root->data = x;
            return;
        }
        if(root->data == x) //要插入结点已存在直接返回
            return;
        else if(root->data > x){    //x比根结点数据域小 需要插在左子树
            insertBST(root->leftChild, x);
        }else if(root->data < x){   //x比根结点数据域大 需要插在右子树
            insertBST(root->rightChild, x);
        }
    }
    node *createBST(){   //建树
        node *root = NULL;
        for(vector<dataTpye>::iterator it = str.begin(); it != str.end(); it++){
            insertBST(root, *it);   //以str为数据组建树
        }
        return root;     //返回根结点
    }
    void preorder(node *root, node *flag){
        if(root == NULL)    //到达空树为递归边界
            return;
        if(root != flag)
             printf(" ");
        printf("%d", root->data);   //访问根结点输出权值
        preorder(root->leftChild, flag);    //访问左子树
        preorder(root->rightChild, flag);    //访问右子树
    
    }
    int main()
    {
        int t;
        while(cin >> t){    //输入结点数量
            str.clear();    //清空权值记录容器
            for(int i = 0; i < t; i++){
                dataTpye temp;
                scanf("%d", &temp); //输入权值
                str.push_back(temp);
            }
            node *root = createBST();   //建树
            preorder(root, root);   //输出先序遍历
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    Spring之IOC容器的生命周期
    Ant Design of Vue a-select下拉框因为数据量太大造成卡顿的问题
    Ant Design of Vue a-form表单效验用法(二)
    Ant Design of Vue a-form表单效验用法(一)
    fullCalendar日历插件玩法解析
    Webpack4.0 --安装以及基本插件热更新(整合)
    Sass语言的安装以及自动编译使用
    Less语言的安装以及自动编译使用
    CSS3响应式布局案例
    html表单填写时条件弹框
  • 原文地址:https://www.cnblogs.com/suvvm/p/9880366.html
Copyright © 2020-2023  润新知