Plantilla universal no recursiva frontal-media-posterior al orden de árbol binario

Para el recorrido no recursivo de árboles binarios, la estructura de datos de la pila se utiliza principalmente para simular la recursividad. Este algoritmo utiliza la estructura de comando para marcar cada nodo para controlar si se imprime. La ventaja de esto es que el código aplica tres métodos de recorrido en orden inicial, medio y posterior. Cuando se marca Cuando la cadena está en marcha, visita sus nodos secundarios. Si se imprime, se imprime el valor del nodo actual y el orden de apilamiento es diferente en el primer, medio y último orden.

Recorrido de reserva

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

//二叉树结点结构体
struct TreeNode {
    
    
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {
    
    }
};

//控制是否打印结构体,使用它可保证此代码适用三种遍历
struct command{
    
    
    string s;
    TreeNode *node;
    command(string s, TreeNode *node): s(s), node(node){
    
    }
};

void preorderTraversal(TreeNode* root) {
    
    
    if(root == NULL)
        return;
    stack<command> st;
    st.push(command("go", root));
    while(!st.empty()){
    
    
        command com = st.top();
        st.pop();
        if(com.s == "print")
            cout<< com.node->val<< " ";
        else{
    
    
            //先将右子树入栈,先访问的就是当前节点,然后左子树
            if(com.node->right)
                st.push(command("go", com.node->right));
            if(com.node->left)
                st.push(command("go", com.node->left));
            st.push(command("print", com.node));
        }
    }
}

Recorrido en orden

El recorrido de orden medio es básicamente el mismo que el anterior. Solo necesita cambiar el orden de apilamiento. Primero, el subárbol derecho se inserta en la pila, luego la marca de nodo actual se cambia para imprimir y se inserta en la pila, y finalmente el subárbol izquierdo se inserta en la pila

if(com.node->right)
	st.push(command("go", com.node->right));
st.push(command("print", com.node));
if(com.node->left)
	st.push(command("go", com.node->left));

Después de modificar el orden, se atraviesa el orden medio.

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

//二叉树结点结构体
struct TreeNode {
    
    
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {
    
    }
};

//控制是否打印结构体,使用它可保证此代码适用三种遍历
struct command{
    
    
    string s;
    TreeNode *node;
    command(string s, TreeNode *node): s(s), node(node){
    
    }
};

void preorderTraversal(TreeNode* root) {
    
    
    if(root == NULL)
        return;
    stack<command> st;
    st.push(command("go", root));
    while(!st.empty()){
    
    
        command com = st.top();
        st.pop();
        if(com.s == "print")
            cout<< com.node->val<< " ";
        else{
    
    
            //先将右子树入栈,再把当前节点标记改为print并入栈,最后左子树入栈
            if(com.node->right)
				st.push(command("go", com.node->right));
			st.push(command("print", com.node));
			if(com.node->left)
				st.push(command("go", com.node->left));
        }
    }
}

Recorrido en orden

El recorrido posterior al pedido también cambia el orden

st.push(command("print", com.node));
if(com.node->right)
    st.push(command("go", com.node->right));
if(com.node->left)
    st.push(command("go", com.node->left));

Después de modificar la orden, es el recorrido posterior a la orden.

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

//二叉树结点结构体
struct TreeNode {
    
    
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {
    
    }
};

//控制是否打印结构体,使用它可保证此代码适用三种遍历
struct command{
    
    
    string s;
    TreeNode *node;
    command(string s, TreeNode *node): s(s), node(node){
    
    }
};

void preorderTraversal(TreeNode* root) {
    
    
    if(root == NULL)
        return;
    stack<command> st;
    st.push(command("go", root));
    while(!st.empty()){
    
    
        command com = st.top();
        st.pop();
        if(com.s == "print")
            cout<< com.node->val<< " ";
        else{
    
    
			st.push(command("print", com.node));
			if(com.node->right)
			    st.push(command("go", com.node->right));
			if(com.node->left)
			    st.push(command("go", com.node->left));
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/UCB001/article/details/106919807
Recomendado
Clasificación