リートコードブラシの質問--101。対称二分木

1つの小さな白、直接コメント領域に移動して学習します。問題解決リンク
へのリンクを添付し
ます:https://leetcode-cn.com/problems/symmetric-tree/solution/bfs-dui-lie-tong-shi- bao-cun-bao- cun-yao-pan-duan- /
バイナリツリー実現リンク:https://blog.csdn.net/Tonywu2018/article/details/89480282

给定一个二叉树,检查它是否是镜像对称的。

 

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \
  2   2
 / \ / \
3  4 4  3
 

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

    1
   / \
  2   2
   \   \
   3    3

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import collections


class TreeNode(object):
    def __init__(self, data=0, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right


class BinTree(object):
    def __init__(self):
        self.root = None
        self.ls = []

    def add(self, data):
        node = TreeNode(data)
        if self.root is None:
            self.root = node
            self.ls.append(self.root)
            return
        treenode = self.ls[0]
        if treenode.left is None:
            treenode.left = node
            self.ls.append(node)
        elif treenode.right is None:
            treenode.right = node
            self.ls.append(node)
            self.ls.pop(0)

    def preOrederTraversal(self, root):
        if root is None:
            return
        print(root.data)
        self.preOrederTraversal(root.left)
        self.preOrederTraversal(root.right)


class Solution(object):
    def isSymmetric(self, Troot: BinTree) -> bool:
        queue = collections.deque()
        queue.append((Troot.root.left, Troot.root.right))
        while queue:
            left, right = queue.popleft()
            if not left and not right:
                continue
            if not left or not right:
                return False
            if left.data != right.data:
                return False
            queue.append((left.left, right.right))
            queue.append((left.right, right.left))
        return True


if __name__ == '__main__':
    L = [1, 2, 2, 3, 4, 4, 3]
    Tree = BinTree()
    for i in L:
        Tree.add(i)
    solution = Solution()
    print(solution.isSymmetric(Tree))

このコードには、主にコード機能を実行し、問題の解決策を書くだけでなく、例を書くための、バイナリツリーの簡単な実装が含まれています。
以下は、学習プロセス中の質問と回答です。

Q:queue = collections.deque()とは何ですか?
dequeは両端キューです。両端からのデータを頻繁に追加する場合は、このデータ構造を選択することをお勧めします。ランダムアクセスを実現する場合は、これを使用することはお勧めしません。リストを使用してください。
dequeの利点は、両側からデータを追加および追加できることです。現時点ではリストはありません。
英語の公式ドキュメントを読んで
くださいhttps://docs.python.org/3.6/library/collections.html#collections.deque

Q:queue.popleft()とは何ですか?
左からポップ

Q:queue.append((root、root))
left、right = queue.popleft()
このコードでは、タプルが追加されていませんか?popleftが2回ポップアップするのはなぜですか?
ここではタプルの左右の省略形ではありませんか?

Q:queue.append((left.left、right.right))
queue.append((left.right、right.left))
left、right = queue.popleft()左右
の値は何ですか?
(1、1)を渡すと、
Left = 1
Right = 1
(1、1)がキューに残ります

アイデア:対称性は非常に単純です。つまり、同じ親ノードを持つノードの場合、
1です。左ノードの左子ノードは、右ノードの右子ノードと同じ値である必要があります
2。左側のノードの右側の子ノードは、右側のノードの左側の子ノードと同じ値である必要があります。

Q:Pythonバイナリツリーは基本構造と追加操作を実現しますか?
Pythonには構造の概念がないため、クラスが必要であり、ツリーノードを構築するための基本的な__init __(self、data)メソッドのみがクラスにあります。

class TreeNode(object):
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

別のクラスはバイナリツリーを表すために使用され、バイナリツリー内の定義のリストは、子ノードを増やすこともできるノードアドレスを格納するために使用されます。

class BinTree(object):
    def __init__(self):
        self.root = None	# 初始化根节点为None,理解为指向一个TreeNode类的指针。
        self.ls = []	# 定义列表,用于存储节点地址

    def add(self, data):
    	# 用add方法向树结构中添加元素
        node = TreeNode(data)	# 实例化一个树节点
        if self.root is None:	# 若根节点不存在,添加根节点
            self.root = node
            self.ls.append(self.root)	# 这里,增加了根节点地址,因为Python没有指针,对应下面的pop(0)
            return
        treenode = self.ls[0]
        if treenode.left is None:
            treenode.left = node
            self.ls.append(node)
        elif treenode.right is None:
            treenode.right = node
            self.ls.append(node)
            self.ls.pop(0)	# 这里,当右子节点添加完毕后,该节点无法添加节点,所以将该节点的地址删除。
            # 这样,列表中剩下的就只有还能添加子节点的节点了

    def preOrederTraversal(self, root):
        if root is None:
            return
        print(root.data)
        self.preOrederTraversal(root.left)
        self.preOrederTraversal(root.right)

おすすめ

転載: blog.csdn.net/qq_44787943/article/details/113113606