zoukankan      html  css  js  c++  java
  • PAT A1099 Build A Binary Search Tree [二叉搜索树]

    题目描述

    链接
    给出一棵二叉搜索树(给出每个结点的左右孩子),且已知根结点为0,求并且给出应该插入这个二叉搜索树的数值,求这棵二叉树的层序遍历

    分析

    • 给了下标,肯定用静态数组实现
    • 利用的性质:二叉搜索树中序遍历肯定有有序
      • 对所给key进行排序,得到中序遍历次序
      • 利用中序遍历次序,对树进行遍历,可以得到存储次序(用(index)保存)(把访问根节点操作变成赋值操作),这个存储次序就是层序遍历顺序
      • 再纠正一点,不是中序遍历建树,树实际是知道结构了,就是每个结点的儿子都知道了。单纯的中序是无法唯一确定一棵树的
      • 同时,存储次序这件事不止是完全二叉树才有的,实际上只要用类似完全二叉树那样存储结点(即满足(i),(2i),(2i+1)那种)的都有,只是其他树浪费空间多。这里可以用一个index来表示该结点的“存储次序”,注意,并不是真的按照这样去存静态结点
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 105;
    struct node{
        int l, r, idx, data;
    }nodes[maxn];
    int a[maxn], b[maxn];
    int n, l, r;
    int len;
    void dfs(int root, int idx){
        if(root == -1) return;
        dfs(nodes[root].l, idx*2+1);
        nodes[root].idx = idx;
        nodes[root].data = a[len++];
        dfs(nodes[root].r, idx*2+2);
    }
    
    bool cmp(node a, node b){
        return a.idx < b.idx;
    }
    
    int main(){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d%d",&nodes[i].l, &nodes[i].r);
        }
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        dfs(0,0);
        sort(nodes, nodes+n, cmp);
        for(int i=0;i<n;i++){
            printf("%d",nodes[i].data);
            if(i!=n-1) printf(" ");
        }
        printf("
    ");
    }
    
    
    • BFS的想法
      • 排序,然后中序遍历赋值(node[i].data),将数据存在ans中,然后层序遍历得到结果
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 105;
    int n, l, r, a[maxn];
    struct node{
       int data;
       int l,r;
    }nodes[maxn];
    vector<int> ans;
    
    void bfs(){
       queue<int> q;
       q.push(0);
       while(!q.empty()){
           int id = q.front();
           q.pop();
           ans.push_back(nodes[id].data);
           if(nodes[id].l != -1) q.push(nodes[id].l);
           if(nodes[id].r != -1) q.push(nodes[id].r);
       }
    }
    int len;
    void inorder(int root){
       if(root == -1) return;
       inorder(nodes[root].l);
       nodes[root].data = a[len++];
       inorder(nodes[root].r);
    }
    
    int main(){
       scanf("%d",&n);
       for(int i=0;i<n;i++){
           scanf("%d%d",&nodes[i].l, &nodes[i].r);
       }
       for(int i=0;i<n;i++){
           scanf("%d",&a[i]);
       }
       inorder(0);
       bfs();
       for(int i=0;i<ans.size();i++){
           if(i==0) printf("%d",ans[i]);
           else printf(" %d",ans[i]);
       }
       printf("
    ");
    
    }
    
    
  • 相关阅读:
    AWVS使用基础教程 什么是AWVS Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具
    91家纺网,三次更新,配套数据库models
    91家纺网,三次更新,此次代码不可联通
    91家纺网,二次更新
    91家纺
    Copy_Excel_To_Excel#--此脚本用于将目标表格写入新的表格--
    Find_Excel_From_Dir获取特定目录下的excel表格,将数据复制出来
    递归解压压缩包_模块更新(需要下载对应的解压程序)
    更新的Main函数
    添加copy模块_复制Excel文件
  • 原文地址:https://www.cnblogs.com/doragd/p/11285500.html
Copyright © 2011-2022 走看看