当前位置:   article > 正文

python树_没有"factanal.rank"这个函数

没有"factanal.rank"这个函数

树的一些定义

节点

节点是树的基本部分。它可以有一个名称,我们称之为“键”。节点也可以有附加信息。我们将
这个附加信息称为“有效载荷”。虽然有效载荷信息不是许多树算法的核心,但在利用树的应用
中通常是关键的。

边是树的另一个基本部分。边连接两个节点以显示它们之间存在关系。每个节点(除根之
外)都恰好从另一个节点的传入连接。每个节点可以具有多个输出边。

树的根是树中唯一没有传入边的节点。在 Figure 2 中,/ 是树的根。

路径

路径是由边连接节点的有序列表。例如,
Mammal→→Carnivora→→Felidae→→Felis→→Domestica是一条路径。

子节点

具有来自相同传入边的节点 c 的集合称为该节点的子节点。在 Figure 2中,节点 log/,spool/
和 yp/ 是节点 var/ 的子节点。

父节点

具有和它相同传入边的所连接的节点称为父节点。在 Figure 2 中,节点 var/ 是节点 log/,
spool/ 和 yp/ 的父节点。

兄弟

树中作为同一父节点的子节点的节点被称为兄弟节点。节点 etc/ 和 usr/ 是文件系统树中的兄
弟节点。

子树

子树是由父节点和该父节点的所有后代组成的一组节点和边。

叶节点

叶节点是没有子节点的节点。

层数

节点 n 的层数为从根结点到该结点所经过的分支数目。

高度

树的高度等于树中任何节点的最大层数。

树具有以下属性:

  • 树的一个节点被指定为根节点。
  • 除了根节点之外,每个节点 n 通过一个其他节点 p 的边连接,其中 p 是 n 的父节点。
  • 从根路径遍历到每个节点路径唯一。
  • 如果树中的每个节点最多有两个子节点,我们说该树是一个二叉树。

列表型树

  1. myTree = ['a', #root
  2. ['b', #left subtree
  3. ['d', [], []],
  4. ['e', [], []] ],
  5. ['c', #right subtree
  6. ['f', [], []],
  7. [] ]
  8. ]
  1. myTree = ['a', ['b', ['d',[],[]], ['e',[],[]] ], ['c', ['f',[],[]], []] ]
  2. print(myTree)
  3. print('left subtree = ', myTree[1])
  4. print('root = ', myTree[0])
  5. print('right subtree = ', myTree[2])

操作列表树

要将左子树添加到树
的根,我们需要在根列表的第二个位置插入一个新的列表。我们必须小心。如果列表已经在
第二个位置有东西,我们需要跟踪它,并沿着树向下把它作为我们添加的列表的左子节点。

  1. def BinaryTree(r):
  2. return [r, [], []]
  3. def insertLeft(root,newBranch):
  4. t = root.pop(1)
  5. if len(t) > 1:
  6. root.insert(1,[newBranch,t,[]])
  7. else:
  8. root.insert(1,[newBranch, [], []])
  9. return root
  10. def insertRight(root,newBranch):
  11. t = root.pop(2)
  12. if len(t) > 1:
  13. root.insert(2,[newBranch,[],t])
  14. else:
  15. root.insert(2,[newBranch,[],[]])
  16. return root
  17. def getRootVal(root):
  18. return root[0]
  19. def setRootVal(root,newVal):
  20. root[0] = newVal
  21. def getLeftChild(root):
  22. return root[1]
  23. def getRightChild(root):
  24. return root[2]

节点表示

  1. class BinaryTree:
  2. def __init__(self,rootObj):
  3. self.key = rootObj
  4. self.leftChild = None
  5. self.rightChild = None

我们必须考虑两种插入情况。 第一种情况的特征没有现有左孩子的节点。当没有左孩子时,只需向树中添加一个节点。 第二种情况的特征在于具有现有左孩子的节点。在第二种情况下,我们插入一个节点并将现有的子节点放到树中的下一个层。

  1. def insertLeft(self,newNode):
  2. if self.leftChild == None:
  3. self.leftChild = BinaryTree(newNode)
  4. else:
  5. t = BinaryTree(newNode)
  6. t.leftChild = self.leftChild
  7. self.leftChild = t
  1. def insertRight(self,newNode):
  2. if self.rightChild == None:
  3. self.rightChild = BinaryTree(newNode)
  4. else:
  5. t = BinaryTree(newNode)
  6. t.rightChild = self.rightChild
  7. self.rightChild = t
  1. def getRightChild(self):
  2. return self.rightChild
  3. def getLeftChild(self):
  4. return self.leftChild
  5. def setRootVal(self,obj):
  6. self.key = obj
  7. def getRootVal(self):
  8. return self.key

树的遍历

有三种常用的模式来访问树中的所有节点。这些模式之间的差异是每个节点被访问的顺序。我们称这种访问节点方式为“遍历”。我们将看到三种遍历方式称为 前序,中序  和 后序  。

  • 前序 在前序遍历中,我们首先访问根节点,然后递归地做左侧子树的前序遍历,随后是右侧子树的递归前序遍历。
  • 中序 在一个中序遍历中,我们递归地对左子树进行一次遍历,访问根节点,最后递归遍历右子树。
  • 后序 在后序遍历中,我们递归地对左子树和右子树进行后序遍历,然后访问根节点。
  1. def preorder(tree): #前序
  2. if tree:
  3. print(tree.getRootVal())
  4. preorder(tree.getLeftChild())
  5. preorder(tree.getRightChild())
  1. def postorder(tree): #后序
  2. if tree != None:
  3. postorder(tree.getLeftChild())
  4. postorder(tree.getRightChild())
  5. print(tree.getRootVal())
  1. def inorder(tree): #中序
  2. if tree != None:
  3. inorder(tree.getLeftChild())
  4. print(tree.getRootVal())
  5. inorder(tree.getRightChild())

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/94245
推荐阅读
相关标签
  

闽ICP备14008679号