La espada se refiere a oferta (C++)-JZ8: el siguiente nodo del árbol binario (estructura de datos - árbol)

Autor: Steven Zhai
Aviso de derechos de autor: Los derechos de autor pertenecen al autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente

Tema Descripción:

Dado un nodo en un árbol binario, encuentre el siguiente nodo en orden transversal y regrese. Tenga en cuenta que los nodos del árbol contienen no solo los nodos secundarios izquierdo y derecho, sino también el siguiente puntero al nodo principal. La siguiente figura muestra un árbol binario con 9 nodos. El puntero del nodo principal al nodo secundario en el árbol está representado por una línea sólida, y el puntero del nodo secundario al nodo principal está representado por una línea discontinua

Ejemplo:

Entrada: {8,6,10,5,7,9,11},8

Devoluciones: 9

Análisis: el nodo raíz del subárbol pasado por este ensamblado es en realidad el árbol completo. Recorrido en orden {5,6,7,8,9,10,11}, el siguiente nodo del nodo raíz 8 es 9, que debería devolver { 9,10,11}, el fondo solo imprime el siguiente nodo del subárbol, por lo que solo se imprime 9, como se muestra en la figura a continuación, de hecho, también hay punteros a los elementos secundarios izquierdo y derecho como punteros al nodo principal, que no se dibujan en la siguiente figura

Rango de datos: el número de nodos satisface 1≤n≤50, y el valor en el nodo satisface 1≤val≤100 

requisitos: complejidad espacial O(1), complejidad temporal O(n) 

Ejemplo:

ingresar:

{8,6,10,5,7,9,11},8

valor de retorno:

9

Ideas para resolver problemas:

Esta pregunta examina el uso de árboles de estructura de datos. Dos métodos:

1) Agrietamiento por fuerza bruta. Obtenga el nodo raíz a través del siguiente puntero, clasifíquelo en el orden medio, guárdelo en el vector durante el proceso de clasificación y luego envíelo directamente según la posición.

2) Combinado con las propiedades de clasificación en orden. Si un nodo tiene un subárbol derecho, el hijo más a la izquierda del subárbol derecho es su siguiente nodo; si no hay un subárbol derecho, su primer padre derecho es su siguiente nodo.

Código de prueba:

1) Agrietamiento por fuerza bruta.

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        if(!pNode)
            return NULL;
        // 确定根结点
        TreeLinkNode* root=pNode;
        while(root->next)
        {
            root=root->next;
        }
        // 中序排序
        vector<TreeLinkNode*> v;
        inorder(root,v);
        for(int i=0;i<v.size();++i)
        {
            if(v[i]==pNode&&(i+1)<v.size())
                return v[i+1];
        }
        return NULL;
    }
    
    // 排序
    void inorder(TreeLinkNode* root,vector<TreeLinkNode*> &v)
    {
        if(!root)
            return;
        // 中序排序
        inorder(root->left,v);
        v.push_back(root);
        inorder(root->right,v);
    }
};

2) Combinado con las propiedades de clasificación en orden.

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        if(!pNode)
            return NULL;
        // 判断是否存在右子树
        if(pNode->right)
        {
            TreeLinkNode* target=pNode->right;
            // 取最左孩子
            while(target->left)
            {
                target=target->left;
            }
            return target;
        }
        // 不存在右子树,寻找第一个右父亲
        while(pNode->next)
        {
            if(pNode->next->left==pNode)
                return pNode->next;
            pNode=pNode->next;
        }
        return NULL;
    }
    

};

Supongo que te gusta

Origin blog.csdn.net/zhaitianbao/article/details/123876984
Recomendado
Clasificación