【问题标题】:Find the non-exposed nodes in a binary tree在二叉树中查找未暴露的节点
【发布时间】:2021-09-19 20:24:48
【问题描述】:

如何在二叉树中找到未暴露的节点。当我说非暴露节点时,我的意思是节点从树的顶部、底部、左侧、右侧覆盖。

含义:
当一个节点在顶部未暴露时:它有一个父节点
当一个节点在底部不暴露时:它至少有一个孩子
当一个节点在左侧(或右侧)不暴露时:它在给定节点的左侧(或右侧)至少有一个处于同一水平级别的节点

注意:树不一定是完全二叉树

【问题讨论】:

  • 您是否在寻找至少没有(父、左、右)节点之一的节点?
  • 澄清问题
  • 什么是二叉树的顶和底?
  • 澄清了这个问题。 Top 和 Bottom 是在一个节点中定义的,而不是在树中。

标签: python


【解决方案1】:

您可以使用广度优先搜索按级别查找所有节点,然后从不是父节点或叶子节点的级别中选择节点,并由左右一个节点缓冲:

from collections import deque, defaultdict
def non_exposed(tree):
   d, q = defaultdict(list), deque([(0, tree)])
   while q:
      d[(v:=q.popleft())[0]].append(v[1])
      q.extend([*filter(lambda x:x[-1], [(v[0]+1, v[1].left), (v[0]+1, v[1].right)])])
   return [j for a, b in d.items() for j in b[1:-1] if a and any([j.left, j.right])]

演示:

import random
class Tree:
   def __init__(self, v, left = None, right = None):
      self.v, self.left, self.right = v, left, right
   def __repr__(self):
      return f'Tree({self.v}, {self.left}, {self.right})'

def get_tree(n):
   v = random.randint(1, 10)
   return None if not n else Tree(v, left=get_tree(n-1), right=get_tree(n-1))

test_tree = get_tree(5)
results = [i.v for i in non_exposed(test_tree)]
print(len(results))

输出:

8

解释:

get_tree 构建了一个完整的n 级别的“二进制”树。在这样的树中,完整节点的总数将为sum(pow(2, i) - 2 for i in range(2, n-1)),因此当n=5 时,结果为8

【讨论】:

  • 谢谢!理解解决方案需要一段时间,但现在很有意义。
  • 这是一些非常密集且难以阅读的代码,就好像你害怕换行一样。我真的不喜欢这种持续存在但完全错误的观念,即单行代码在某种程度上代表了开发人员的天才。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多