データ構造とアルゴリズム、Pythonツリーとバイナリツリー

二分木

  • ルートノード(root)は最上位ノードです

  • 開始ノードから終了ノードの経験豊富なエッジまでのパス(パス)

  • ルートノードを除いて、各親ノードはその親ノードです

  • 子(子)エッジが指す下のノードの各ノード

  • 兄弟は同じ父親を持ち、同じノードにいます

  • サブツリー(サブツリー)各ノードには、そのすべての子孫で構成されるサブツリーが含まれます

  • リーフノード(リーフノード)子のないノードが子ノードになります
    バイナリツリーは単純で一般的に使用される構造であり、各ノードには2つの子が含まれます
    バイナリツリー関連の概念

  • ノードの深さ(深さ)ノードに対応するレベルの数

  • 木の高さ(高さ)レベルはゼロから計算されるため、二分木の高さはレベル番号+1です。

  • 数の幅(幅)二分木の幅は、ノードレベルが最大のノードの数を指します。
    完全な二分木:各内部ノード(非リーフノード)に2つの子が含まれている場合、完全な二分木になります。 、
    完全な二分木:すべてのリーフノード、すべて同じレベル。
    完全な二分木:高さhの完全な二分木はh-1に縮小され、下のスロットは左から右に埋められます。これは
    完全な二分木。実際、リンクされたリスト、1つのノードといくつかの類似点があります。二分木を
    トラバースするには、子のポインタを保存する必要があります

  • 最初のルート順序トラバーサル:最初にルートを処理し、次に左側のサブツリーと右側のサブツリーを処理します

  • 中根順走査:左サブツリー、処理ルート、右サブツリー

  • ルート後の順序トラバーサル:左サブツリー、右サブツリールート

#节点
class BSTNode(object):
    def __init__(self,key, value,right = None,left = None):
        self.key, self.value,self.right,self.left = key, value , right , left

class BinTree(object):
    def __init__(self,root = None):
        self.root = root

    @classmethod
    def build_from(cls,node_list):
        """
        通过节点信息构造二叉树
        第一次遍历我们的构造 node 节点
        第二次遍历给root 和 孩子值
        最后我们用root 初始化这个类并返回一个对象
        """
        #创建一个空字典
        node_dict = {}
        #遍历list
        for node_data in node_list:
            data = node_data['data']
            #实例化节点,赋值给字典
            node_dict[data] = BSTNode(data)
        #第二层次遍历list
        for node_data in node_list:
            data = node_data['data']
            node = node_dict[data]
            if node_data['is_root']:
                root = node
            node.left = node_dict.get(node_data['left'])
            node.right = node_dict.get(node_data['right'])
        #返回BinTree对象
        return cls(root)

おすすめ

転載: blog.csdn.net/weixin_44865158/article/details/100798615
おすすめ