Implementación de data structure_cue binary tree_python

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.


Inserte la descripción de la imagen aquí
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:
Inserte la descripción de la imagen aquí

27 artículos originales publicados · elogiados 2 · visitas 680

Supongo que te gusta

Origin blog.csdn.net/qq_44273739/article/details/105498527
Recomendado
Clasificación