• 一道谷歌面试题


    反转二叉树

    大致思路: 在输入时直接进行交换两个子节点的存储位置,如果有任意一个节点空,则用-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;  
    }  
    
    
  • 相关阅读:
    python 创建文件夹
    Python利用pandas处理Excel数据的应用
    解决git rebase操作后推送远端分支不成功的问题
    LeetCode 1 两数之和
    LeetCode 70 爬楼梯
    LeetCode 11 盛水最多的容器
    LeetCode 283 移动零
    数据结构与算法 ---- 数组 -- Array
    跳表???
    自顶向下编程
  • 原文地址:https://www.cnblogs.com/wlw-x/p/11681428.html
Copyright © 2020-2023  润新知