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)