0
点赞
收藏
分享

微信扫一扫

Python实现二叉树


整体是基于链表思想做的。代码很简单,可阅读源码搞定。

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=' ')

我们实现下图表示的二叉树,并使用前序、中序、后序遍历方法遍历。

Python实现二叉树_中序

测试:

# -*- 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设计的极其啰嗦和辣鸡。


举报

相关推荐

0 条评论