整体是基于链表思想做的。代码很简单,可阅读源码搞定。
class Node:
def __init__(self,val,left_node=None,right_node=None):
self._val=val
self._left_node=left_node
self._right_node=right_node
@property
def value(self):
return self._val
@value.setter
def value(self,val):
self._val=val
@property
def left(self):
return self._left_node
@left.setter
def left(self,left_node):
self._left_node=left_node
@property
def right(self):
return self._right_node
@right.setter
def right(self,right_node):
self._right_node=right_node
class BinaryTree:
def __init__(self,node):
self._head=node
def insert_left(self,node):
if self._head.left:
temp=self._head.left
self._head.left=node
node.left=temp
else:
self._head.left=node
def insert_right(self,node):
if self._head.right:
temp=self._head.right
self._head.right=node
node.right=temp
else:
self._head.right=node
def _get_left_child(self):
return self._head.left
def _get_right_child(self):
return self._head.right
def insert_left_child(self,node,is_left_ptr=False):
ptr=self._get_left_child()
if ptr:
if is_left_ptr:
ptr.left=node
else:
ptr.right=node
else:
self._head.left=node
def insert_right_child(self,node,is_right_ptr=False):
ptr=self._get_right_child()
if ptr:
if is_right_ptr:
ptr.right=node
else:
ptr.left=node
else:
self._head.right=node
def get_root_value(self):
return self._head.value
def get_left_value(self):
return self._head.left.value
def get_right_value(self):
return self._head.right.value
def get_root_ptr(self):
return self._head
def pre_order(self,root):
if root is None:
return
print(root.value,end=' ')
self.pre_order(root.left)
self.pre_order(root.right)
def mid_order(self,root):
if root is None:
return
self.mid_order(root.left)
print(root.value,end=' ')
self.mid_order(root.right)
def bac_order(self,root):
if root is None:
return
self.bac_order(root.left)
self.bac_order(root.right)
print(root.value,end=' ')
我们实现下图表示的二叉树,并使用前序、中序、后序遍历方法遍历。
测试:
# -*- coding: utf-8 -*-
from link_binary_tree import BinaryTree
from link_binary_tree import Node
a=BinaryTree(Node(1))
a.insert_left(Node(4))
a.insert_left_child(Node(8),True)
a.insert_left_child(Node(9))
a.insert_left(Node(2))
a.insert_left_child(Node(5))
a.insert_right(Node(3))
a.insert_right_child(Node(6),False)
a.insert_right_child(Node(7),True)
a.pre_order(a.get_root_ptr())
print()
a.mid_order(a.get_root_ptr())
print()
a.bac_order(a.get_root_ptr())
输出:
1 2 4 8 9 5 3 6 7
8 4 9 2 5 1 6 3 7
8 9 4 5 2 6 7 3 1
总之,第一版代码,API设计的极其啰嗦和辣鸡。