♥二叉树层序遍历♥

直接看代码:

#include<iostream>
#include<string>
#include<queue>
using namespace std;

//代码简单易懂
class Node{
public:
    char data;
    Node* left;
    Node* right;
    Node(char ch){
        data=ch;
        left=nullptr;
        right=nullptr;
    }
    void setLeft(Node* left){
        this->left=left;
    }
    void setRight(Node* right){
        this->right=right;
    }
};

class Tree{
    Node* root;
    int pos;
    string strTree;
public:
    void create(string s){
        pos=0;
        strTree=s;
        root=createTree();
    }
    Node* createTree(){
        Node* t;
        char ch=strTree.at(pos++);
        if(ch=='0'){
            t=nullptr;
        }else{
            t=new Node(ch);
            t->setLeft(createTree());
            t->setRight(createTree());
        }
        return t;
    }
    void levelOrderShow(){
        levelOrder(root);
    }
    void levelOrder(Node* t){
        queue<Node*> q;
        q.emplace(t);
        while(!q.empty()){
            Node* node=q.front();
            q.pop();
            if(node->left!=nullptr){
                q.emplace(node->left);
            }
            if(node->right!=nullptr){
                q.emplace(node->right);
            }
            cout<<node->data;
        }
    }
};

//力扣上的一道题,在层序遍历的时候区别出是那一层的,本代码中并没有调用该方法
class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> result;
        if (!root) {
            return result;
        }
        vector<int> level;
        queue<Node*> q;

        //先放入初始的根节点和第一个隔板
        q.emplace(root);
        Node* board=new Node(0);
        q.emplace(board);
        
        //常规做法
        while(!q.empty()){
            Node* tmp=q.front();
            q.pop();
            if(tmp==board){
                result.emplace_back(level);
                level.clear();
                //一定要是队列不为空的时候插入隔板
                if(!q.empty())
                    q.emplace(tmp);
            }else{
                level.emplace_back(tmp->data);
                if(tmp->left!=nullptr)
                    q.emplace(tmp->left);
                if(tmp->right!=nullptr)
                    q.emplace(tmp->right);
            }
        }
        //翻转这里要注意一下,我要用reverse就必须定义出迭代器
        //vector<vector<int>>::iterator it=result.begin();
        //vector<vector<int>>::iterator itt=result.end();
        //reverse(it,itt);
        return result;
    }
};

int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        Tree* tree=new Tree();
        tree->create(s);
        tree->levelOrderShow();
        cout<<endl;
    }
    return 0;
}

我是花花,祝自己也祝您变强了~

Guess you like

Origin blog.csdn.net/m0_52711790/article/details/120916020