#!/usr/bin/env python
# -*- coding:utf8 -*-
class Node(object):
def __init__(self, item):
self.item = item
self.lchild = None
self.rchild = None
class Tree(object):
def __init__(self):
self.root = None
def add(self, item):
"""安装完全二叉树的规则挂树"""
# 1 若树为空,则直接挂到根节点
if self.root is None:
self.root = Node(item)
return
# 2 根节点入队
que = []
que.append(self.root)
while len(que) > 0:
# 3 出队,依次判断是否有左右孩子,若没有则挂树
cur = que.pop(0)
if cur.lchild is None:
cur.lchild = Node(item)
return
if cur.rchild is None:
cur.rchild = Node(item)
return
# 4 依次入队左右孩子,重复步骤3
que.append(cur.lchild)
que.append(cur.rchild)
def breath_travel(self):
# 1 根节点入队
if self.root is None:
return
que = []
que.append(self.root)
while len(que) > 0:
# 2 出队打印,依次判断是否有左右孩子,若有则入队
cur = que.pop(0)
print(cur.item, end="--")
if cur.lchild is not None:
que.append(cur.lchild)
if cur.rchild is not None:
que.append(cur.rchild)
# 3 重复步骤2 直到队列空
print()
def preorder(self, root):
if root is None:
return
print(root.item, end="--")
self.preorder(root.lchild)
self.preorder(root.rchild)
def inorder(self, root):
if root is None:
return
self.inorder(root.lchild)
print(root.item, end="--")
self.inorder(root.rchild)
def postorder(self, root):
if root is None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print(root.item, end="--")
def search(self, root, item):
if root is None:
return None
if root.item == item:
return root
lres = self.search(root.lchild, item)
if lres is not None:
return lres
rres = self.search(root.rchild, item)
if rres is not None:
return rres
return None
def pub_dad(self,root, nodeA, nodeB):
"""查找root包含节点A或节点B"""
# 查找nodeA和nodeB最近的公共祖先节点
if root is None:
return None
# 1 判断任意节点是否满足:两个节点是否有其中之一是该节点并且另一个节点是该节点的子孙----》该节点就是要求的节点
# ---》该节点包含两个节点其中之一,左孩子不包含另一个节点或右孩子不包含另一个个节点
if root == nodeA or root == nodeB:
return root
# 2 判断任意节点是否满足:两个节点分别属于该节点的左右孩子----》该节点就是要求的节点
# ---》左孩子包含两个节点其中之一,右孩子也包含两个节点其中之一
l_dad = self.pub_dad(root.lchild, nodeA, nodeB)
r_dad = self.pub_dad(root.rchild, nodeA, nodeB)
# 若root的左孩子不包含A和B---》公共节点是右孩子
if l_dad is None:
return r_dad
# 若root的右孩子不包含A和B--->公共节点是右孩子
elif r_dad is None:
return l_dad
else:
return root
tree data structure
于 2019-03-27 09:01:43 首次发布