Fortuna abandonó Francia 3 bases class4- encontrar un nodo de tema en el binario sucesor del nodo del árbol, nodo predecesor

1. Título: encontrar el sucesor de un nodo en un árbol binario

Hay un nuevo tipo de nodos de árbol binario de la siguiente manera:
public class Nodo
{
int valor público;
público abandonó el nodo;
pública del nodo derecho;
pública el padre del nodo;
pública el Nodo (int datos) = Datos {this.value;}
}
La estructura de árbol binario de lo normal una estructura de múltiples nodos de los punteros que señalan a los padres del nodo principal. Supongamos que un binario nodos tipo de nodo, cada nodo en los punteros de padres árbol se dirigen adecuadamente su nodo padre, el primer nodo de la matriz NULL. Sólo un nodo a nodo en un árbol binario, implementar una función que devuelve nodos sucesores del nodo. En el recorrido preorden secuencia del árbol binario, el siguiente nodo de un nodo a otro se llama el nodo sucesor . Encontrar el sucesor de un nodo en un árbol binario. (4,2,5,1,6,3,7 secuencia de desplazamiento es de 2 a 4 es un relé, el relé 5 es 2 ... un número de los nodos de retransmisión es un número de pre)

Aquí Insertar imagen Descripción

2. Análisis

Este problema es esencialmente para encontrar el siguiente nodo en un recorrido en preorden de los nodos como el nodo descendiente. secuencia de orden transversal es la derecha-izquierda.
(1) Para un nodo si tiene el subárbol derecho, entonces el nodo sucesor de este nodo es el nodo más a la izquierda de su subárbol derecho. La razón es que en el orden de recorrido es el orden de izquierda a derecha con el subárbol derecho, entonces el nodo es un nodo, el nodo siguiente es su hijo derecho nodos en el árbol, y el subárbol derecho se deja en el orden correcto, las operaciones de búsqueda nodo más a la izquierda. Por lo que el sucesor del nodo actual es el nodo más a la izquierda de su subárbol derecho. 1 subárbol más a la derecha es el nodo izquierdo 6, de modo que el relé 1 es 6.
(2) Para un nodo si el niño derecho no existe, si el subárbol izquierdo del nodo padre del nodo actual es el nodo actual, su nodo padre es el sucesor del nodo actual. Si no es así, el nodo actual se convierte en el nodo padre, sigue buscando. La razón es el nodo padre como un nodo, si el nodo es el nodo sucesor debe ser antes de que un nodo es el último nodo en el subárbol izquierdo. Para 2,4 es el último nodo en el subárbol izquierdo de 2, 2 4 es un nodo relé, para un subárbol izquierdo 1,5 es el último nodo, el nodo relé 5 es 1.
Si no hay ningún nodo padre (2) vacíos caso nodo posterior, el último nodo 7 no es el nodo de retransmisión. Las condiciones de frontera requieren atención.

código 3. núcleo

(1) una nueva estructura de datos de árbol binario

class Tree
{
public:
	int val;
	Tree *right;
	Tree *left;
	Tree *parent;
	Tree(int x)
	{
		this->val = x;
		this->left = NULL;
		this->right = NULL;
		this->parent = NULL;
	}
};

(2) añadir un nodo en el árbol (el constructor)

	Tree *head = new Tree(1);
	head->left = new Tree(2);
	head->left->parent = head;
	head->left->left = new Tree(4);
	head->left->left->parent = head->left;
	head->left->right = new Tree(5);
	head->left->right->parent = head->left;

	head->right = new Tree(3);
	head->right->parent = head;
	head->right->left = new Tree(6);
	head->right->left->parent = head->right;
	head->right->right = new Tree(7);
	head->right->right->parent = head->right;

(3) Para encontrar un nodo sucesor

Tree* getSuccessorNode(Tree *cur)
{
	//节点为空中继节点为空
	if(cur == NULL)
		return cur;
	//右子树存在
	if(cur->right != NULL)
	{
		cur = cur->right;
		while(cur->left!=NULL)//找右子树上最左节点
		{
			cur = cur->left;
		}
		return cur;
	}
	else//右子树不存在
	{
		//父节点为空时没有中继节点;父节点的左子树是当前节点则为中继节点
		while(cur->parent!=NULL && cur->parent->left != cur)
		{
			cur = cur->parent;
		}
		return cur->parent;
	}
}

4. El código completo

#include <iostream>
using namespace std;

class Tree
{
public:
	int val;
	Tree *right;
	Tree *left;
	Tree *parent;
	Tree(int x)
	{
		this->val = x;
		this->left = NULL;
		this->right = NULL;
		this->parent = NULL;
	}
};

Tree* getSuccessorNode(Tree *cur)
{
	//节点为空中继节点为空
	if(cur == NULL)
		return cur;
	//右子树存在
	if(cur->right != NULL)
	{
		cur = cur->right;
		while(cur->left!=NULL)//找右子树上最左节点
		{
			cur = cur->left;
		}
		return cur;
	}
	else//右子树不存在
	{
		//父节点为空时没有中继节点;父节点的左子树是当前节点则为中继节点
		while(cur->parent!=NULL && cur->parent->left != cur)
		{
			cur = cur->parent;
		}
		return cur->parent;
	}
}

int main()
{
	Tree *head = new Tree(1);
	head->left = new Tree(2);
	head->left->parent = head;
	head->left->left = new Tree(4);
	head->left->left->parent = head->left;
	head->left->right = new Tree(5);
	head->left->right->parent = head->left;

	head->right = new Tree(3);
	head->right->parent = head;
	head->right->left = new Tree(6);
	head->right->left->parent = head->right;
	head->right->right = new Tree(7);
	head->right->right->parent = head->right;
	//打印
	Tree* succ = getSuccessorNode(head->right);
	if(succ == NULL)
		cout<<"NULL";
	else
		cout<<succ->val;
		
	system("pause");
	return 0;
}

nodo predecesor Hallazgo: 5. Agregado

Del mismo modo: (1) cuando el subárbol izquierdo, el nodo más a la derecha en el subárbol izquierdo es el precursor del nodo actual. La razón es que cuando el nodo subárbol como el nodo actual, el nodo más a la derecha en el subárbol izquierdo es finde recorrido, el orden izquierda-derecha-izquierda en el último nodo, el siguiente nodo es un nodo que se encuentra en el nodo actual, por lo que la izquierda nodo de sub-árbol de más a la derecha es los nodos precursores nodo actual
(2) del nodo actual es el hijo derecho de su padre, el nodo padre es el predecesor del nodo actual. nodo padre como un nodo, en la secuencia de izquierda a derecha, el hijo derecho se deja en el orden correcto en el derecho, entonces el nodo padre es el predecesor del nodo actual.

Publicado 51 artículos originales · ganado elogios 1 · vistas 1375

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/103879820
Recomendado
Clasificación