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;
}
};