怎么在Python中创建一个二叉树
这篇文章将为大家详细讲解有关怎么在Python中创建一个二叉树,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
二叉树节点定义
二叉树的节点定义如下:
class TreeNode():#二叉树节点 def __init__(self,val,lchild=None,rchild=None): self.val=val#二叉树的节点值 self.lchild=lchild#左孩子 self.rchild=rchild#右孩子
递归构建二叉树
本文使用的前序递归构建的方法(其余顺序读者自行变化,本文主要意在如何快速构建能够执行的二叉树)
例如,我们想构建一个如下图所示的树(其前序遍历结果为:abcde):
这里我们需要使用到扩展的二叉树,也就是要告诉计算机什么是叶结点,什么是空节点,否侧无法分辨左右节点。例如先序遍历的顺序为"abcde",扩展的二叉树前序序列为:“abc##d##e##”,#代表此处节点为None,如下图:
既然是使用递归的方法构建二叉树,主要需要理解递归的过程,这种思路将在之后的很多地方用的到。
要知道如何递归的构建二叉树,我们不能纠结于递归每一层到底干了什么,这样就会一直纠结下去(所有的递归问题都一样)。我们需要注意的是:
在我们的任务中,终止条件是什么?
在我们的任务中,本次递归要干嘛?
在我们的任务中,本次递归要返回给上一次递归的是啥?
在递归构建二叉树的任务中,我们要做到不纠结于每一层,而是只关注该层在做什么,这样,对于下图左侧的树,我们就可以看作为右侧的树,它只有自己a (a),左子树B (bcd)和右子树C (e)。
这样我们需要注意的那三个问题的回答自然就有了(做递归问题,心中要想着怎么回答这三个问题):
在我们的任务中,终止条件是什么?
[给我们的字符用完,也就不需要再创建节点了]
在我们的任务中,本次递归要干嘛?
[本次递归要创建三个节点,一个根节点,一个左节点,一个右节点]
在我们的任务中,本次递归要返回给上一次递归的是啥?
[当然是返回一个本层构造好的树的根节点]
理解了上述三个问题的回答,递归的代码自然可以写出:
def Creat_Tree(Root,val): if len(vals)==0:#终止条件:val用完了 return Root if vals[0]!='#':#本层需要干的就是构建Root、Root.lchild、Root.rchild三个节点。 Root = TreeNode(vals[0]) vals.pop(0) Root.lchild = Creat_Tree(Root.lchild,val) Root.rchild = Creat_Tree(Root.rchild,val) return Root#本次递归要返回给上一次的本层构造好的树的根节点 else: Root=None vals.pop(0) return Root#本次递归要返回给上一次的本层构造好的树的根节点
看懂了上述内容,构建一棵我们想象的二叉树就很简单了,只要输入一个我们心目中前序遍历扩展的二叉树序列即可:
if __name__ == '__main__': Root = None strs="abc##d##e##"#前序遍历扩展的二叉树序列 vals = list(strs) Roots=Creat_Tree(Root,vals)#Roots就是我们要的二叉树的根节点。
关于怎么在Python中创建一个二叉树就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341