Fortuna izquierdo-derecho base título class4- 7-1 para determinar si un árbol es un árbol binario de búsqueda

1. Título: juzgar si un árbol es un árbol binario de búsqueda

2. Análisis

(1) búsqueda de árbol binario

Se refiere a cualquier árbol de búsqueda binaria cabeza subárbol de nodo, el nodo principal es menor que el subárbol izquierdo, subárbol derecho es mayor que el nodo principal.
Aquí Insertar imagen Descripción
Para el nodo 3, el subárbol izquierdo es más pequeño que 3, subárbol derecho 4 es mayor que 3;
para el nodo 5, subárbol izquierdo 3 es menor que 5, subárbol derecho 8 es mayor que 5;
Para el nodo 6, el subárbol derecho 7 es mayor que 6;
para el nodo 10 , a menos de 10 9 subárbol izquierdo;
para el nodo 8, menos de 6 8 subárbol izquierdo, subárbol derecho 10 es mayor que 8;

(2) Ideas de resolución de problemas

Uso finde recorrido , en el orden de salida de orden transversal está justo a la izquierda, a la derecha, y la izquierda menos que un árbol binario de búsqueda en menos de un derecho, entonces toda la salida preorden están dispuestos en orden ascendente árbol binario de búsqueda.

código 3. núcleo

Establecer (1) del árbol

Lista de almacenamiento mediante un árbol binario, un campo de datos de diseño, dos campo de puntero (puntos sobre el niño).

class Tree
{
public:
	int val;
	Tree *left;
	Tree *right;
	//构造函数
	Tree(int x){
		this->val = x;
		this->left = NULL;
		this->right = NULL;
	}
};

Función principal:

	Tree *head = new Tree(5);
	head->left = new Tree(3);
	head->left->left = new Tree(2);
	head->left->right = new Tree(4);
	head->right = new Tree(8);
	head->right->left = new Tree(6);
	head->right->right = new Tree(10);
	head->right->left->right= new Tree(7);

secuencia de recorrido (2) no recursiva

Cuando la pila no está vacía, el bucle o el nodo actual no está vacía, el nodo actual no está vacío, la pila y el nodo actual que señala a su subárbol izquierdo; nodo actual está vacía, la pila, el número de pila del nodo actual señalando subárbol derecho.

consejos: ¿Por qué utilizar la pila para almacenar? Véase el primer orden de la parte no recursiva

void inOrderUnRecur(Tree* head)
{
	stack<Tree*> t;
	while(!t.empty() || head != NULL)
	{
		//当前节点不为空,入栈并把当前节点指向其左子树
		if(head != NULL)
		{
			t.push(head);
			head = head->left;
		}
		//当前节点为空时,出栈,当前节点指向出栈数的右子树
		else
		{
			head = t.top();
			cout<<t.top()->data<<" ";
			t.pop();
			head = head->right;
		}
	}
}

(3) cambia preorder

El momento de la salida de impresión en preorden en comparación con el reemplazo del nodo ascendente, preorden pila utilizada para almacenar la orden de salida, si la necesidad actual sólo comparar el número de pila emergente necesita mayor que el número de pop-up (ascendente) puede.

bool isBST(Tree *head)
{
	stack<Tree *> t;
	int pre = INT_MIN;//使用pre存储前一个弹出的数,INT_MIN是系统int型最小的数,因为第一次比较必须小于当前节点
	while(!t.empty() || head != NULL)
	{
		if(head != NULL)
		{
			t.push(head);
			head = head->left;
		}
		else
		{
			head = t.top();
			//比较:如果上个弹出的数大,不是搜索二叉树
			if(t.top()->val < pre)
				return false;
			pre = t.top()->val;//否则更新pre为现在弹出的数
		
			t.pop();
			head = head->right;
		}
	}
	return true;//所有比较完成,前面并没有返回,运行到这里时返回true是搜索树
}

4. El código completo

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


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

bool isBST(Tree *head)
{
	stack<Tree *> t;
	int pre = INT_MIN;//使用pre存储前一个弹出的数,INT_MIN是系统int型最小的数
	while(!t.empty() || head != NULL)
	{
		if(head != NULL)
		{
			t.push(head);
			head = head->left;
		}
		else
		{
			head = t.top();
			//比较:如果上个弹出的数大,不是搜索二叉树
			if(t.top()->val < pre)
				return false;
			pre = t.top()->val;//否则更新pre为现在弹出的数
		
			t.pop();
			head = head->right;
		}
	}
	return true;
}

int main()
{
	Tree *head = new Tree(5);
	head->left = new Tree(3);
	head->left->left = new Tree(2);
	head->left->right = new Tree(4);
	head->right = new Tree(8);
	head->right->left = new Tree(6);
	head->right->right = new Tree(10);
	head->right->left->right= new Tree(7);

	cout<<isBST(head);


	system("pause");
	return 0; 
}
Publicado 51 artículos originales · ganado elogios 1 · vistas 1372

Supongo que te gusta

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