• PAT A1102 Invert a Binary Tree [反转二叉树]


    题目描述

    链接
    反转一棵二叉树,给出原二叉树的每个结点的左右孩子,输出它的层序和中序遍历

    分析

    • 反转二叉树就是存储时交换左右结点,也可以遍历时交换遍历次序
    • 如何找root,别人用的have[i]=1标记,我用的二重循环
    • 处理输入输出,用string+stoi更简单,我用的char*和自己写的stoi,然后string和%s都是以空格回车tab作为输入结束
    • 输入整行的话,string用getline(cin,str), char用gets(s)
    • 别人好像有更好的写法:一个dfs输出层序和中序,我写的是分开的,先研究下别人的
      • 已知根结点,用递归的方法可以把中序遍历的结果push_back到数组v1里面,直接输出就是中序,排序输出就是层序(排序方式,层数小的排前面,相同层数时,index大的排前面)
      • 我搞不懂为啥不可以直接index排

    别人的

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    struct node {
        int id, l, r, index, level;
    } a[100];
    vector<node> v1;
    void dfs(int root, int index, int level) {
        if (a[root].r != -1) dfs(a[root].r, index * 2 + 2, level + 1);
        v1.push_back({root, 0, 0, index, level});
        if (a[root].l != -1) dfs(a[root].l, index * 2 + 1, level + 1);
    }
    bool cmp(node a, node b) {
        if (a.level != b.level) return a.level < b.level;
        return a.index > b.index;
    }
    int main() {
        int n, have[100] = {0}, root = 0;
        cin >> n;
        for (int i = 0; i < n; i++) {
            a[i].id = i;
            string l, r;
            cin >> l >> r;
            if (l != "-") {
                a[i].l = stoi(l);
                have[stoi(l)] = 1;
            } else {
                a[i].l = -1;
            }
            if (r != "-") {
                a[i].r = stoi(r);
                have[stoi(r)] = 1;
            } else {
                a[i].r = -1;
            }
        }
        while (have[root] == 1) root++;
        dfs(root, 0, 0);
        vector<node> v2(v1);
        sort(v2.begin(), v2.end(), cmp);
        for (int i = 0; i < v2.size(); i++) {
            if (i != 0) cout << " ";
            cout << v2[i].id;
        }
        cout << endl;
        for (int i = 0; i < v1.size(); i++) {
            if (i != 0) cout << " ";
            cout << v1[i].id;
        }
        return 0;
    }
    

    我的

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 20;
    struct node{
        int l,r;
    }nodes[maxn];
    
    
    int n, rt;
    char l[10],r[10];
    int stoi(char *s){
        int len = strlen(s);
        int ans = 0;
        for(int i=0;i<len;i++){
            ans = ans * 10 + s[i]-'0';
        }
        return ans;
    }
    vector<int> level;
    void bfs(){
        queue<int> q;
        q.push(rt);
        while(!q.empty()){
            int i = q.front();
            q.pop();
            level.push_back(i);
            if(nodes[i].l != -1) q.push(nodes[i].l);
            if(nodes[i].r != -1) q.push(nodes[i].r);
        }
    }
    vector<int> in;
    void dfs(int root){
        if(root == -1) return;
        dfs(nodes[root].l);
        in.push_back(root);
        dfs(nodes[root].r);
    }
    
    vector<int> tmp;
    int main(){
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%s %s",l,r);
            if(strcmp(l,"-")==0) nodes[i].r = -1;
            else{
                int num = stoi(l);
                tmp.push_back(num);
                nodes[i].r = num;
            }
            if(strcmp(r,"-")==0) nodes[i].l = -1;
            else{
                int num = stoi(r);
                tmp.push_back(num);
                nodes[i].l = num;
            }
        }
        bool flag;
        for(int i=0;i<n;i++){
            flag = false;
            for(int j=0;j<tmp.size();j++){
                if(tmp[j] == i){
                    flag = true;
                    break;
                }
            }
            if(!flag) rt = i;
        }
        bfs();
        dfs(rt);
        for(int i=0;i<level.size();i++){
            if(i==0) printf("%d",level[i]);
            else printf(" %d",level[i]);
        }
        printf("
    ");
        for(int i=0;i<in.size();i++){
            if(i==0) printf("%d",in[i]);
            else printf(" %d",in[i]);
        }
        printf("
    ");
    
    }
    
    
  • 相关阅读:

    第一次发贴,也是在看了首页吵架贴后有感,也给博客园提个提议
    【把玩信息图之标签云】看看我一年的邮件在扯什么
    VS发布Web时自动调用YUICompressor批量压缩JS、CSS
    用JavaScript实现自己的DOM选择器
    一键发布应用了seajs的asp.net项目
    在JavaScript中应用单例模式
    Qt 资料大全
    C#的不足(1):匿名类型的不足之处
    LINQ解析:LINQ to Objects简介
  • 原文地址:https://www.cnblogs.com/doragd/p/11288612.html
Copyright © 2020-2023  润新知