【问题标题】:How to validate a Binary Tree?如何验证二叉树?
【发布时间】:2018-09-29 01:57:37
【问题描述】:

我一直在研究二叉树和二叉源树。遇到树(BT)的这个非常基本的问题,并挑战要证明的二叉树的属性。


问题:给定一个节点(根),检查这是否是一个有效的二叉树。不要求验证给定的 BT 是否是 BST,而只是要求检查以下是否是 BT。

Valid:
  X1
 /  \
X4   X5
 \    \
  X3   X7

Invalid:
  X1
 /  \
X4   X5
 \  /  \
  X3   X7


# A Python class that represents an individual node in a BT
class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key 

    def isNotBinaryTree(root):
        # code here

if isNotBinaryTree(root):
   print "True"
else: 
   print "False"

我知道这不是一棵二叉树(事实上,根据它的定义和属性,这甚至不是一棵树)。 问题是......我如何证明或验证这一点?或者我如何验证这不是一个 BT,其中 x4 和 x5 -> x3(多个父(节点)指向同一个子节点?***没有提供数据!如果我要解决,算法/逻辑会是什么样子这个?(首选Python xx)

【问题讨论】:

  • 做一个dfs并检查它是否包含一个循环。
  • @DhruvSehgal 我猜“dfs”在这里指的是“深度优先策略”?而当你说“包含一个循环”时,检查一下这些节点(X4,X3,X1,X5)是否形成一个循环?
  • 是的,这正是我要说的
  • 这是我最初的想法……谢谢!

标签: tree binary-tree binary-search-tree binary-search b-tree


【解决方案1】:

点击下面的链接可以更深入地了解 BT/BST: https://en.wikipedia.org/wiki/Tree_traversal

def nodes_visited(root, key):
    if root.next:
        if root.next in key: 
            return True
        key.append(root)
        return nodes_visited(root.next, key)
    return False

def has_cycle(head):
    return nodes_visited(root=head, key=[])

【讨论】:

    【解决方案2】:

    鉴于您的数据结构,取一个节点并递归查看是否存在具有简单函数的循环应该很容易,例如:

    def hasCycle(node, seen = set()):
        if node in seen: return True
        seen.add(node)
        if node.left and hasCycle(node.left, seen): 
            return True
        if node.right and hasCycle(node.right, seen): 
            return True
        return False
    

    这只是进行深度优先搜索并保持一组节点被访问。如果你看到一个节点两次,那就是一个循环。

    【讨论】:

    • 新手在这里...你介意解释一下代码吗?在"seen = set()" 的部分
    • @JohnDoe seen = set() 是 python 中的默认参数。如果没有向函数的第二个参数传递任何内容,它将使seen 成为新的set。它省去了在函数范围之外进行集合的麻烦。在每次递归中,我们将 seen 集合作为参数传递回来,允许将单个集合用于所有递归。您也可以使用 while 循环和堆栈而不是递归来做同样的事情。
    • 啊,有道理。这样您就可以跟踪您在集合中看到的内容。
    • 如果一个循环不存在但一个节点有三个孩子怎么办?那也不是有效的二叉树。
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2021-10-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多