Pista árbol binario
El árbol binario de pista se basa en el árbol binario ordinario. Se cambia el campo de puntero nulo en el nodo raíz. El puntero izquierdo apunta al nodo precursor del nodo actual, y el puntero derecho apunta al nodo sucesor del nodo actual. Este tipo de lista binaria con pistas se llama lista de hilos, y el árbol binario correspondiente se llama árbol binario enhebrado (Threeded BinaryTree). De acuerdo con la naturaleza diferente de las pistas, el árbol binario de la pista se puede dividir en tres tipos: árbol binario de la pista de orden previo, árbol binario de la pista de orden medio y árbol binario de la pista de orden posterior.
Descripción del caso de la aplicación Clue binary tree : después del árbol binario clue, los atributos del nodo Node izquierda y derecha son los siguientes:
(1) left se refiere al subárbol izquierdo y también puede ser el nodo precursor al que apunta. Por ejemplo, ① node left apunta a la izquierda El subárbol y la izquierda del nodo points apunta al nodo predecesor.
(2) El derecho apunta al subárbol derecho y también puede apuntar a los nodos sucesores, por ejemplo, el nodo right apunta al subárbol derecho y el nodo and apunta a la derecha Es el nodo sucesor.
Esta vez, el código usa principalmente python para completar la transformación del árbol binario ordinario en un árbol binario de pista de orden medio. Construya un árbol binario basado en la foto de arriba. Una vez que se completa el código, la corrección del código se prueba llamando a la izquierda y a la derecha del nodo hoja.
Analicemos primero el nodo 10, de acuerdo con nuestra definición del árbol binario de pista. Necesitamos obtener primero la secuencia transversal de orden medio del árbol binario: {8, 3, 10, 1, 14, 6}. Entonces, el nodo predecesor del nodo 10 es 3, y el nodo sucesor es 1. Entonces, si la pista es correcta, llamamos a los punteros izquierdo y derecho del nodo 10, y los dos nodos que obtenemos son 3 y 1.
#线索化二叉树
#二叉树
#先创建结点
class HeroNode(object):
def __init__(self,no,name):
self.no = no
self.name= name
self.left=None
self.right=None
'''
1、如果leftType==0,表示指向左子树;
leftType==1,表示指向前驱节点
2、如果rightType==0,表示指向右子树;
rightType==1,表示指向后继节点
'''
self.leftType=None
self.rightType=None
def setleft(self,node):
self.left = node
def setright(self,node):
self.right = node
#中序遍历线索化
class ThreadBinaryTree(object):
def __init__(self):
self.root=None
#为了实现线索化,需要增加这个属性,保留前一个节点
self.pre=None
def setRoot(self,root):
self.root = root
#编写二叉树进行线索的方法
def threadedNode(self,node):
if node == None:
return
self.threadedNode(node.left)
#处理当前节点的的前驱节点
if node.left==None:
node.left=self.pre
node.leftType=1
if self.pre!=None and self.pre.right == None:
#前驱节点的右指针指向当前节点
self.pre.right=node
self.pre.rightType=1
self.pre = node
self.threadedNode(node.right)
def threadedList(self):
node = self.root
while(node!=None):
while(node.leftType==0):
node=node.left
print("no = {}; name = {}".format(node.no,node.name))
while(node.rightType==1):
node=node.right
print("no = {}; name = {}".format(node.no,node.name))
node = node.right
node1 = HeroNode(1,'关胜')
node2 = HeroNode(3,'刘备')
node3 = HeroNode(6,'张飞')
node4 = HeroNode(8,'曹操')
node5 = HeroNode(10,'李逵')
node6 = HeroNode(14,'大力')
print('测试中序线索二叉树的功能')
tree = ThreadBinaryTree()
node1.setleft(node2)
node1.setright(node3)
node2.setleft(node4)
node2.setright(node5)
node3.setleft(node6)
tree.setRoot(node1)
tree.threadedNode(node1)
leftnode = node5.left
rightnode= node5.right
print('id={};name={}'.format(leftnode.no,leftnode.name))
print('id={};name={}'.format(rightnode.no,rightnode.name))
print('list:')
tree.threadedList()
El resultado de ejecutar el código es: