• 一道谷歌面试题


    反转二叉树

    大致思路: 在输入时直接进行交换两个子节点的存储位置,如果有任意一个节点空,则用-1来表示,之后再利用dfs遍历出前序进行前序建树,建树之后利用递归进行中序遍历,
    利用队列辅助进行层序遍历由于输入要求最后一个不能有空格所以利用vector存储答案后再处理输出细节

    输入处理部分代码

    //初始化输入输出  
    void init(){  
        cin >> n;  
        char a, b;  
        for (int i = 0; i < n; i++){  
            cin >> a >> b;  
            int c, d;  
            if (a == '-')c = -1;  
            else { c = a - '0'; vis[c] = 1; }  
            if (b == '-')d = -1;  
            else { d = b - '0'; vis[d] = 1;}  
            map[i].push_back(d);map[i].push_back(c);  
        }  
    }  
      
    

    找到根节点得出前序顺序

    核心代码:

    int findroot(){//找爹函数  
        for (int i = 0; i < n; i++){  
            if (vis[i] == false)return i;  
        }
    void dfsTrave(int root){//获取前序遍历  
        if (root == -1){  
            BT.push_back(-1);  
            return;  
        }  
        else BT.push_back(root);  
        for (int i = 0; i < map[root].size(); i++)  
            dfsTrave(map[root][i]);  
        return;  
    }      
      
    

    得到中序遍历和层序遍历

    void levelorder(Tree *root){//层序遍历  
        queue<Tree*> q;  
        q.push(root);  
        while (!q.empty()){  
            Tree *newnode = q.front();  
            q.pop();levelor.push_back(newnode->data);  
            if (newnode->left != nullptr)q.push(newnode->left);  
            if (newnode->right != nullptr)q.push(newnode->right);  
        }  
        return;  
    }  
    
    void inorer(Tree *root){//中序遍历  
        if (root == nullptr)return;  
        inorer(root->left);  
        inor.push_back(root->data);  
        inorer(root->right);  
    }  
    

    完整代码

    #include <iostream>  
    #include <vector>  
    #include <queue>  
    using namespace std;  
    int n = 0,k = 0;  
    //map存储二叉树的关系  
    //由于输出需要 最后一个位置没有空格所以利用容器进行辅助控制输出  
    //   BT : 存储dfs遍历得到的前序序列  
    vector<int> map[100],inor,levelor,BT;  
    bool vis[100]; //bool 数组用于辅助找到根节点  
    typedef struct node{//链式二叉树结构  
        int data;  
        struct node *left,*right;  
    }Tree;  
      
    //初始化输入输出  
    void init(){  
        cin >> n;  
        char a, b;  
        for (int i = 0; i < n; i++){  
            cin >> a >> b;  
            int c, d;  
            if (a == '-')c = -1;  
            else { c = a - '0'; vis[c] = 1; }  
            if (b == '-')d = -1;  
            else { d = b - '0'; vis[d] = 1;}  
            map[i].push_back(d);map[i].push_back(c);  
        }  
    }  
      
    int findroot(){//找爹函数  
        for (int i = 0; i < n; i++){  
            if (vis[i] == false)return i;  
        }  
    }  
      
    void dfsTrave(int root){//获取前序遍历  
        if (root == -1){  
            BT.push_back(-1);  
            return;  
        }  
        else BT.push_back(root);  
        for (int i = 0; i < map[root].size(); i++)  
            dfsTrave(map[root][i]);  
        return;  
    }  
      
    Tree *BuildTree(){//根据前序遍历建立数  
        Tree *node = new Tree;  
        if (BT[k] != -1){  
            node->data = BT[k];  
            k++;node->left = BuildTree();  
            k++;node->right = BuildTree();  
        }  
        else return nullptr;  
        return node;  
    }  
    void inorer(Tree *root){//中序遍历  
        if (root == nullptr)return;  
        inorer(root->left);  
        inor.push_back(root->data);  
        inorer(root->right);  
    }  
    void levelorder(Tree *root){//层序遍历  
        queue<Tree*> q;  
        q.push(root);  
        while (!q.empty()){  
            Tree *newnode = q.front();  
            q.pop();levelor.push_back(newnode->data);  
            if (newnode->left != nullptr)q.push(newnode->left);  
            if (newnode->right != nullptr)q.push(newnode->right);  
        }  
        return;  
    }  
    int main(){  
        init();  
        int root = findroot(); //找到根节点进行  
        dfsTrave(root);        //dfs获取前序并进行建树  
        Tree *start = BuildTree();  
        levelorder(start); //进行层序遍历  
        //输出答案部分  
        for (int i = 0; i < levelor.size() - 1; i++)  
            printf("%d%c", levelor[i], i != levelor.size() - 1 ? ' ':'
    ');  
        inorer(start);    //进行中序遍历  
        for (int i = 0; i < inor.size() - 1; i++)  
            printf("%d%c", inor[i], i != inor.size() - 1 ? ' ' : '
    ');  
        return 0;  
    }  
    
    
  • 相关阅读:
    Java IO输入输出流 FileWriter 字符流
    Java IO输入输出流File 字节流
    Java List集合和Map集合的综合应用
    表单提交中的重复问题(表单令牌验证)
    php中const与define的区别
    阿里云中获取文件及目录列表的方法
    巧用php中的array_filter()函数去掉多维空值
    文件大小格式化函数
    UTC 通用格式时间 转换为 时间戳,并格式化为2017-01-01 12:00:00
    关于匿名函数的使用,购物车中计算销售税的应用
  • 原文地址:https://www.cnblogs.com/wlw-x/p/11681428.html
Copyright © 2020-2023  润新知