¿Por qué la salida del árbol binario de Python es así?
1. Árbol binario
Cada nodo de un árbol binario (árbol binario) no puede tener más de dos nodos secundarios.
1.1 Implementación de la lista de árbol binario
El árbol binario que se muestra en la figura anterior se puede expresar como una lista: 12345678tree=['A', ?#root?['B', #subárbol izquierdo[ 'D',[],[]],['E',[],[]]],? ['C',?#Subárbol derecho['F',[],[]], [] ]?
Implementación:1234567891011121314151617181920def?BinaryTree(item):return?[item,[],[]]]def?insertLeft(tree,item):leftSubtree=tree.pop(1) if ?leftSubtree :tree.insert(1,[item,leftSubtree,[]])else:tree.insert(1,[item,[]],[]])return?treedef?insertRight(tree,item).rightSubtree= árbol pop(2)if?rightSubtree:tree.insert(2,[item,[],rightSubtree])else:tree.insert(2,[item,[]],[]])return?getLeftChild(tree) :return tree[1]def?getRightChild(tree):return?tree[2]
Para implementar el árbol que se muestra a continuación: 123456tree=BinaryTree('a')insertLeft(tree,'b ')insertRight (árbol,'c')insertRight((getLeftChild(árbol)),'d')insertLeft((getRightChild(árbol)),'e')insertRight((getRightChild(árbol)) ,'f')
1.2 Implementación de clase del árbol binario 12345678910111213141516171819class?BinaryTree(object):def?__init__(self,item):self.key=itemself.leftChild=Noneself.rightChild=Nonedef?insertLeft(self,item):if?self. leftChild==Ninguno:self.leftChild=BinaryTree(item)else:t=BinaryTree(item)t leftChild=self.leftChildself.leftChild=tdef?insertRight(self,item):if?self.rightChild==Ninguno:self .rightChild=BinaryTree(item)else:t=BinaryTree(item)t.rightChild=self.rightChildself.rightChild=t
2 Árbol de expresión
Árbol de expresión (expresión Las hojas del árbol son los operandos y los otros nodos son los operadores.
Figura?((7+3)*(5-2))
2.1 Construir un árbol de expresiones basado en expresiones intermedias:
Expresiones transversales:
1. Cree un árbol vacío
2. Cuando encuentre '(', agregue un nodo secundario izquierdo al nodo actual y use el nodo secundario izquierdo como nodo actual.
Cuando se encuentre ('+-*/'), asígnelo al nodo actual, agregue un nodo como el nodo secundario correcto y trate el nodo secundario correcto como el nodo actual.
5. Cuando se encuentra ')', devuelve el nodo principal del nodo actual. 123456789101112131415161718192021222324def?buildexpressionTree(exp):tree=BinaryTree('') stack=[] stack.append(tree)currentTree=treefor?i?in?exp:if?i=='(':currentTree.insertLeft(' ') stack.append(currentTree)currentTree=currentTree.leftChildelif?i?not?in?'+-*/()':currentTree.key=int(i)parent=stack.pop()currentTree=parentelif?i? en? insertRight('')stack.append(currentTree)currentTree=currentTree.rightChildelif?i==')':currentTree=stack.pop()else:raise está escrito en forma de (a+(b*c) ).
Construir un árbol de expresiones usando expresiones postfix es más simple: si el símbolo es un operando, se crea un nodo y el puntero a ese nodo se inserta en la pila. Si el símbolo es un operador, los punteros a los dos árboles T1 y T2 se extraen de la pila y se forma un nuevo árbol cuya raíz es este operador, con los subárboles izquierdo y derecho apuntando a T2 y T1 respectivamente.
123456789101112131415def?build_tree_with_post(exp):stack=[]oper=' +-*/' for?i?in?exp:if?i?not?in?oper:tree=BinaryTree(int(i))stack.append( árbol)else:righttree=stack.pop()lefttree=stack.pop()tree= BinaryTree(i)tree.leftChild=lefttreetree.rightChild=righttreestack.append(tree)return?stack.pop()
3. Recorrido de árbol
3.1 Recorrido de preorden (recorrido de preorden)
Primero imprima la raíz, luego imprima recursivamente los subárboles izquierdo y derecho, correspondientes a la expresión de prefijo 12345678def?preorder( árbol, nodelist=Ninguno):if?nodelist?is?None:nodelist=[]if?tree.nodelist.append(tree.key)preorder(tree.leftChild,nodelist)preorder(tree.rightChild,nodelist)return?2 middle Traverse (inorder) travelsal)
Imprime recursivamente el subárbol izquierdo, luego imprime la raíz y finalmente imprime recursivamente el subárbol derecho, correspondiente a la expresión intermedia 12345def?inorder(tree):if?tree:inorder ( tree.leftChild)print?tree.keyinorder (tree.rightChild)
3.3 Cursor de postorden
Imprima recursivamente los subárboles izquierdo y derecho, y luego imprima la raíz, que es consistente con la expresión postorder Corresponde a 1234567def?postorder(tree):if?tree:for?key?in ?postorder(tree.leftChild):yield?keyfor?key?in?postorder(tree.rightChild):yield?keyyield?tree .key
3.4 Evaluación del árbol de expresión 1234567891011def ?postordereval(tree):operators={'+':operator.add,'-':operator.sub,'*':operator.mul,'/ ':operator.trudiv}leftvalue=Ningunorightvalue= Ningunoif?tree:leftvalue=postordereval(tree.leftChild)rightvalue=postordereval(tree.rightChild)if?leftvalue?and?rightvalue:return? )de lo contrario: ¿regresar?