【发布时间】:2021-09-29 03:01:41
【问题描述】:
我需要检查二叉树中是否存在路径。我得到了一个元素列表和一个要遍历的二叉树。我正在使用 DFS 检查路径是否存在。这个想法是我应该找到从根节点到叶节点的路径是否存在。
如果我执行以下操作,我知道我可以找到路径是否存在...
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_path(root, sequence):
if root is None:
return len(sequence) == 0
return find_path_helper(root, sequence, 0)
def find_path_helper(current_node, sequence, sequence_index):
if current_node is None:
return False
sequence_length = len(sequence)
if sequence_index >= sequence_length or current_node.val != sequence[sequence_index]:
return False
if current_node.left is None and current_node.right is None and sequence_index == sequence_length - 1:
return True
return find_path_helper(current_node.left, sequence, sequence_index + 1) or \
find_path_helper(current_node.right, sequence, sequence_index + 1
但是,我没有考虑代码效率的第一个想法是保留从根到叶的路径列表并将其与要找到的列表进行比较,但我无法让它工作,我不确定是什么我做错了。
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_path(root, sequence):
if root is None:
return len(sequence) == 0
return find_path_helper(root, sequence, [])
def find_path_helper(current_node, sequence, current_sequence):
if current_node is None:
return False
current_sequence.append(current_node.val)
if current_node.left is None and current_node.right is None:
return current_sequence == sequence
return find_path_helper(current_node.left, sequence, current_sequence) or \
find_path_helper(current_node.right, sequence, current_sequence)
但即使为 true,也只会返回 false。我在想 current_sequence 从根遍历到叶子后会有当前路径。
以树为例
1
/ \
0 1
| |\
1 6 5
我需要检查路径 1 -> 1 -> 6 是否存在
下面是树的一个例子
root = TreeNode(1)
root.left = TreeNode(0)
root.right = TreeNode(1)
root.left.left = TreeNode(1)
root.right.left = TreeNode(6)
root.right.right = TreeNode(5)
sequence = [1, 1, 6]
print(find_path(root, sequence))
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_path(root, sequence):
if root is None:
return len(sequence) == 0
return find_path_helper(root, sequence, [])
def find_path_helper(current_node, sequence, current_sequence):
if current_node is None:
return False
current_sequence.append(current_node.val)
if current_node.left is None and current_node.right is None:
return current_sequence == sequence
# if I pass in a copy of current_sequence it works
# I'm not sure why this does though
return find_path_helper(current_node.left, sequence, list(current_sequence)) or \
find_path_helper(current_node.right, sequence, list(current_sequence))
最后这段代码有效,但我不知道为什么我必须传递current_sequence 的副本
【问题讨论】:
-
你如何代表树?
-
发布的代码不是有效的 Python。
-
抱歉忘记添加
def。它是一棵二叉树。一个父节点不超过2个子节点 -
请提供调用
find_path的例子。 -
而
TreeNode的定义是……?
标签: python recursion binary-tree depth-first-search