【算法练习】数据结构/二叉树 根据前序遍历重建二叉树

题目链接:https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=40&tqId=21342&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

复习一次新的错误:

bug是寻找中序中的idx的时候判断的时候把== 写成 赋值=

题目描述

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

输入描述:

输入包括1行字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。

示例1

输入

abc##de#g##f###

输出

c b e g d f a 

题解1:

可以如上图画出这个二叉树,他的条件是给出了所有的空结点#,所以可以直接递归建树,对比另外镜面的那一题。

按照输入的前序遍历的序列建立二叉树,然后再对其进行中序遍历

注意根据前序遍历建立二叉树时,递归建树的时候新建Node *root

AC代码1:

//根据前序遍历构建二叉树
#include <iostream>
using namespace std;
struct Node{
    char c;
    Node *left;
    Node *right;
}tree[120];
int loc,idx;
string pre;
Node *create(char c){
    tree[loc].left=tree[loc].right=NULL;
    tree[loc].c=c;
    return &tree[loc++];
}

Node *buildbyPre(){
    char c=pre[idx++];
    if(c=='#') return NULL;
    Node *root=create(c);
    root->left=buildbyPre();
    root->right=buildbyPre();
    return root;
}

void inOrder(Node *root){
    if(root->left!=NULL)
        inOrder(root->left);
    cout<<root->c<<" ";
    if(root->right!=NULL)
        inOrder(root->right);
}

int main(){

    while(cin>>pre){
        loc=0;
        idx=0;
        Node *root=buildbyPre();
        inOrder(root);
        cout<<endl;
    }

    return 0;
}

题解2:

正好去复习了一下二叉树的知识哈,在二叉树的非递归遍历的过程中,

前序遍历和中序遍历有相似的地方,他们都是利用堆栈完成了遍历的过程。

前序遍历是先输出再压栈,中序遍历是

入栈时访问是前序遍历!出栈时访问是中序遍历!

所以就可以将前序遍历转换成中序遍历,虽然好像还是有些迷惑(

AC代码2:

#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
    string pre;
    while(cin>>pre){
        stack<char> s;
        while(!s.empty()) s.pop();
        for(auto it:pre){
            if(it!='#'){
                s.push(it);
            }
            else{
                if(!s.empty()){
                    cout<<s.top()<<" ";  //出栈的时候访问
                    s.pop();
                }
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40760678/article/details/100144927