zoukankan      html  css  js  c++  java
  • 牛客网计算机考研复试-KY11-二叉树的遍历

    题目链接:点这里


    题目描述:
    编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。


    思路1:

    根据先序遍历建立二叉树,在中序遍历输出结果。


    代码1:

    #include <bits/stdc++.h>
    using namespace std;
    string s;
    int i;
    struct TreeNode{
        char data;
        struct TreeNode *left,*right;
    };
    
    TreeNode* creat(){
        char c = s[i++];
        ///不用考虑s[i]超内存,有#控制,访问不到s[s.length()]
        if(c=='#')
            return NULL;
        TreeNode *root = new TreeNode();
        root->data = c;
        root->left = creat();
        root->right = creat();
        return root;
    }
    
    void inOrderTraversal(TreeNode* node){
        if(node==NULL)
            return;
        inOrderTraversal(node->left);
        cout << node->data << " ";
        inOrderTraversal(node->right);
    }
    
    int main(){
        while(cin >> s){
            i = 0;
            TreeNode *root = creat();
            inOrderTraversal(root);
        }
        return 0;
    }
    
    

    思路2:

    评论里有一个很棒的思路:二叉树的先序遍历入栈,出栈顺序就是它的中序遍历(好像王道408数据结构有讲过)。


    代码2:

    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        string s;
        while(cin >> s){
            stack<char> c;
            for(int i=0;i<s.length()-1;i++){
                if(s[i]=='#'){
                    cout << c.top() << " ";
                    c.pop();
                }
                else{
                    c.push(s[i]);
                }
            }
            cout << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    Linux系统调用
    Kubernetes 中强化tab 功能
    Docker镜像构建之案例分享
    网络基础之名词介绍
    网络基础协议之UDP(下篇)
    网络基础协议之UDP(上篇)
    内核升级
    尼恩 Java高并发三部曲 [官方]
    CDN图解(秒懂
    DNS图解(秒懂
  • 原文地址:https://www.cnblogs.com/123-wind/p/14329776.html
Copyright © 2011-2022 走看看