zoukankan      html  css  js  c++  java
  • 一道谷歌面试题

    反转二叉树

    大致思路: 在输入时直接进行交换两个子节点的存储位置,如果有任意一个节点空,则用-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;  
    }  
    
    
  • 相关阅读:
    jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解
    jQuery 源码解析(二十三) DOM操作模块 替换元素 详解
    jQuery 源码解析(二十二) DOM操作模块 复制元素 详解
    jQuery 源码分析(二十一) DOM操作模块 删除元素 详解
    jQuery 源码分析(二十) DOM操作模块 插入元素 详解
    jQuery 源码分析(十九) DOM遍历模块详解
    python 简单工厂模式
    python 爬虫-协程 采集博客园
    vue 自定义image组件
    微信小程序 image组件坑
  • 原文地址:https://www.cnblogs.com/wlw-x/p/11681428.html
Copyright © 2011-2022 走看看