【问题标题】:Python Binary Tree print nodes with two exactly two childrenPython二叉树打印节点有两个正好两个孩子
【发布时间】:2014-12-12 14:15:39
【问题描述】:

如何创建一个函数来返回树中具有两个子节点的节点数?

我的课代码如下:

class RefBinaryTree:
    def __init__(self, data, left=None, right=None):
        self.key = data
        self.left = left
        self.right  = right

    def insert_left(self, value):
        self.left = RefBinaryTree(value, left=self.left)  

    def insert_right(self, value):
        self.right = RefBinaryTree(value, right=self.right)

    def get_left_subtree(self):
        return self.left

    def get_right_subtree(self):
        return self.right

    def set_value(self, new_value):
        self.key = new_value

    def get_value(self):
        return self.key

    def create_string(self, indent):
        string = str(self.key) + '---+'
        if self.left:
            string += '\n(l)' + indent + self.left.create_string(indent + '    ')
        if self.right:
            string += '\n(r)' + indent + self.right.create_string(indent + '    ')
        return string

    def __str__(self):
        return self.create_string('  ')

我猜最好使用递归。任何提示或有用的链接都会很棒。谢谢。

【问题讨论】:

  • 只使用递归,你会卡在哪里?
  • 寻找一些树遍历算法。递归的很简单。

标签: python recursion binary-tree


【解决方案1】:

递归地计算两个子节点真的很简单。如果您在每次函数调用时返回一个数字(基本情况为零),您只需在每次找到两个子节点时加 1:

def findDoubleNodes(tree):
    if tree == None or (tree.left == None and tree.right == None):
        # base case
        return 0
    elif tree.left <> None and tree.right <> None:
        # both have children, so add one to our total and go down one level
        return findDoubleNodes(tree.left)+findDoubleNodes(tree.right) + 1
    else:
        # only one child, so only go down one level
        return findDoubleNodes(tree.left)+findDoubleNodes(tree.right)

输入RefBinaryTree 返回具有两个子节点的节点数。一个例子:

x = RefBinaryTree(1)
x.insert_left(5)
x.left.insert_left(6)
x.left.insert_right(7)
x.left.right.insert_left(8)
x.left.right.insert_right(9)
x.left.right.right.insert_right(10)

(懒惰地)创建的树如下所示:

    1
   /
  5
 / \
6   7
   / \
  8   9
       \
       10

findDoubleNodes(x) 返回2,因为只有两个节点(5 和 7)有两个孩子。

此外,将左子节点添加到节点 9 (x.left.right.right.insert_left(11)) 具有预期结果,返回 3

【讨论】:

    【解决方案2】:

    应该这样做:

    def countNodes(tree):
        if tree is None:
            return 0
        left = tree.get_left_subtree()
        rght = tree.get_right_subtree()
        return (0 if left is None or rght is None else 1) \
               + countNodes(left) + countNodes(rght)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2020-01-18
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2018-12-17
      相关资源
      最近更新 更多