代码
class TreeNode(): ...
class TreeNode():
def __init__(self,data = "") -> None:
self.data = data
self.deep = 0
self.__children = []
self.parent = None
def add(self,subTreeNode) -> TreeNode:
assert isinstance(subTreeNode,TreeNode)
subTreeNode.deep = self.deep + 1
subTreeNode.parent = self
if subTreeNode not in self.__children:
self.__children.append(subTreeNode)
for node in subTreeNode.__children:
subTreeNode.add(node)
return self
def adds(self,*subList) -> None:
for node in subList:
assert isinstance(node,TreeNode)
self.add(node)
def printNode(self) -> None:
print(" " * self.deep + self.data)
for subTreeNode in self.__children:
assert isinstance(subTreeNode,TreeNode)
subTreeNode.printNode()
def depthFirst(self) -> None:
print(self.data,end = "")
for node in self.__children:
assert isinstance(node,TreeNode)
node.depthFirst()
def breadthFirst(self,b = True) -> None:
if b:
print(self.data,end = "")
for node in self.__children:
assert isinstance(node,TreeNode)
print(node.data,end = "")
for node in self.__children:
assert isinstance(node,TreeNode)
node.breadthFirst(False)
def ABC(self) -> None:
print(self.data,end = "")
if len(self.__children) > 0:
self.__children[0].ABC()
if len(self.__children) > 1:
self.__children[1].ABC()
def BAC(self) -> None:
if len(self.__children) > 0:
self.__children[0].BAC()
print(self.data,end = "")
if len(self.__children) > 1:
self.__children[1].BAC()
def BCA(self) -> None:
if len(self.__children) > 0:
self.__children[0].BCA()
if len(self.__children) > 1:
self.__children[1].BCA()
print(self.data,end = "")
a = TreeNode("a")
b = TreeNode("b")
c = TreeNode("c")
d = TreeNode("d")
e = TreeNode("e")
f = TreeNode("f")
g = TreeNode("g")
a.adds(b,c)
b.adds(d,e)
c.adds(f,g)
a.printNode()
a.ABC()
print()
a.BAC()
print()
a.BCA()
ABC是先序
BAC是中序
BCA是后序
讲解
树的基本参数有
数据(data),深度(deep),子树(children)和父母(parent)
这就是初始化函数
class TreeNode():
def __init__(self,data = "") -> None:
self.data = data
self.deep = 0
self.__children = []
self.parent = None
树,不可能只有一个结点,所以我们要添加一些结点。
添加后的子树比原来的树深度+1,子树的父母是self,很好理解。
下一行是拒绝重复添加结点
添加之后,把子树的所有结点进行更新,完成。
最后返回self,是因为方便:
a.add(b.add(c))
然后在add的基础上做一个adds就可以了
class TreeNode():
def __init__(self,data = "") -> None:
self.data = data
self.deep = 0
self.__children = []
self.parent = None
def add(self,subTreeNode) -> TreeNode:
assert isinstance(subTreeNode,TreeNode)
subTreeNode.deep = self.deep + 1
subTreeNode.parent = self
if subTreeNode not in self.__children:
self.__children.append(subTreeNode)
for node in subTreeNode.__children:
subTreeNode.add(node)
return self
def adds(self,*subList) -> None:
for node in subList:
assert isinstance(node,TreeNode)
self.add(node)
深度优先搜索
把self打印
然后对每一颗子树进行深度优先搜索
广度优先搜索
把根节点打印,然后打印子树根结点,然后对子树进行广度优先搜索
先序,后序,中序要用迭代的方式,没有问题。
结束
这是树的实现和搜索,对于一些问题可以快速解决,应该很有用