creedcc 2021-05-28 15:32 采纳率: 100%
浏览 168
已采纳

Python实现,由父节点往下遍历生成一棵树

已知各节点关系,怎么生成一棵树

用代码怎么实现

  • 写回答

1条回答 默认 最新

  • 小P聊技术 2021-05-28 15:33
    关注

    前序遍历/先序遍历

    通过调用树的preorder函数,生成一个关于树的前序迭代器。(yield函数)

    def preorder(self):
        """生成树的前序遍历序列"""
        if not self.is_empty():
            for p in self._subtree_preorder(self.root()):  # 开始迭代
                yield p
    
    def _subtree_preorder(self,p):
        yield p                              # 生成根节点
        for c in self.children(p):           # 对每个根节点的左右子树都进行迭代 直至节点为叶节点
            for other in self._subtree_preorder(c):
                yield other
        
    

    后序遍历

    前序遍历和后续遍历的区别在于递归查到子树之后,再生成根节点

    def postorder(self):
        """生成树的后序遍历序列"""
        if not self.is_empty():
            for p in self._subtree_preorder(self.root()):  # 开始迭代
                yield p
    
    def _subtree_preorder(self,p):
        for c in self.children(p):           # 对每个根节点的左右子树都进行迭代 直至节点为叶节点
            for other in self._subtree_preorder(c):
                yield other
        yield p                              # 生成根节点
    

    广度优先遍历

    BFS不是递归,其借助于队列来管理递归。

    from collections import deque
    def bfs(self):
    	if not self.is_empty():
    		a=deque()               # 创建一个空队列
    		a.append(self.root())   # 从根节点开始
    		while not a.is_empty(): # 循环截止条件是队列pop为空
    			p=a.popleft()		# 弹出根节点
    			yield p
    			for c in self.children(p): # 放入每个根节点的子节点 
    				a.append(c)
    
    

    中序遍历

    前三中方法可以用于树的任何结构中,而中序遍历,只能用于二叉树中。
    过程和前序、后序遍历类似,更改根节点和左右子树遍历的位置即可

    def inorder(self):
    	if not self.is_empty():
    		for p in self._subtree_inorder(self.root()):
    			yield p
    
    def _subtree_inorder(self,p):
    	if self.left(p) is not None:          # 遍历左子树
    		for other in self._suntree_inorder(self.left(p)):
    			yield other
    	yield p										# 遍历根节点																		
    	if self.right(p) is not None:				# 遍历右子树
    		for other in self._suntree_inorder(self.right(p)):
    			yield other
    	
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?