# 二叉树

``````class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data
``````

``````class Node：
# ...
def insert(self, data):
if data < self.data: # 树叉小于节点
if self.left is None: # 并且左面的树叉为空
self.left = Node(data) # 当仁不让的插入
else:                   # 非空的话
self.left.insert(data) # 以左树叉为节点继续插入

elif data > self.data:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)
else:
self.data = data
``````

``````class Node:
# ...
def search(self, data, parent=None):
'''
data为目标查询值，同时返回parent(父节点)便于定位。
'''
if data < self.data:
if self.left is None:
return None, None
else:
return self.left.search(data, self)

elif data > self.data:
if self.right is None:
return None, None

return self.right.search(data, self)
else:
#  return self.data, parent.data
return self, parent
``````

``````    def print_tree(self):
if self.left:
self.left.print_tree()
print(self.data)
if self.right:
self.right.print_tree()

``````

1. 目标节点下没有任何节点(0个)
2. 目标节点下有一个节点
3. 目标节点下有两个节点

``````class Node：
# ...
def chrildren(self):
count = 0
if self.left:
count += 1

if self.right:
count += 1

return count
``````

``````class Node：
# ...
def delete(self, data):
node, parent = self.search(data)
chrildren = node.chrildren() # 子节点数目
if chrildren == 0: # 情况 1
if parent.left is node: # 判断目标节点是其父节点的 左or右 节点
parent.left = None
else:
parent.right = None
del node

elif chrildren == 1: # 情况 2
if node.left:
tmp = node.left
else:
tmp = node.right
if parent:
if parent.left is node:
parent.left = tmp
else:
parent.right = tmp
del node
else:                # 情况 3 没看太懂，过两天再看吧
'''
第三种情况比较复杂
1. 左节点0个子节点
2. 左节点1个子节点
3. 左节点2个子节点
'''
parent = node
successor = node.left
while successor.left:
parent = successor
successor = successor.left
node.data = successor.data
if parent.left = successor:
parent.left = successor.right
else:
parent.left = successor.right

# 接下来可以测试以下种的树怎么样啦。
root = Node(11)
root.insert(14)
root.insert(9)
root.insert(9)
root.insert(7)
root.insert(10)
root.insert(4)
root.insert(5)
root.insert(6)
root.insert(8)
value, parent = root.search(10)
print(value.data, parent.data)
root.print_tree()
print('*' * 20)
root.delete(4)
root.print_tree()

``````

`2016-05-28`

### 推荐阅读更多精彩内容

• 树的概述 树是一种非常常用的数据结构，树与前面介绍的线性表，栈，队列等线性结构不同，树是一种非线性结构 1.树的定...
Jack921阅读 3,615评论 1 30
• 本文转自 http://www.cnblogs.com/manji/p/4903990.html二叉树-****你...
doublej_yjj阅读 375评论 0 8
• 去年二叉树算法的事情闹的沸沸扬扬，起因是Homebrew 的作者 @Max Howell 在 twitter 上发...
Masazumi柒阅读 905评论 0 8
• 1.什么是二叉树？ 在计算机科学中，二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”，...
zcaaron阅读 825评论 2 15
• 二叉树 在计算机科学中，二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”，左子树和右子...
静默加载阅读 1,231评论 0 3