【问题标题】:Recursive function for creating a binary search tree用于创建二叉搜索树的递归函数
【发布时间】:2020-05-03 13:43:44
【问题描述】:

我目前正在阅读Cracking the code interview这本书,试图在编码方面达到一个下降的水平(虽然我还差得很远)。

问题如下: 给定一个具有唯一整数元素的排序(递增顺序)数组,写一个 创建具有最小高度的二叉搜索树的算法。

这是我的尝试。

class Node:
    def __init__(self,value):
        self.value = value
        self.left = None
        self.right  = None

class binaryTree:
    def __init__(self,nodes,root):
        self.nodes = nodes
        self.root = root

def minimalTree(sortedArray):
    if not sortedArray:
        return None

    else:
        lengthArray = len(sortedArray)
        middle = lengthArray//2
        print("middle = ", middle)
        root = Node(sortedArray[middle])
        leftArray = array.array('i',[])
        rightArray = array.array('i',[])
        if middle == 0:
            return root
        if middle > 0:
            leftArray = sortedArray[0:middle]
            root.left = Node(leftArray[len(leftArray)//2])

        if middle + 1 < lengthArray: 
            rightArray = sortedArray[middle+1:lengthArray]
            root.right = Node(leftArray[len(rightArray)//2])

        return minimalTree(leftArray),minimalTree(rightArray)

如您所见,我并没有真正使用 binaryTree 类,但我不确定它是否有用,因为树可以由它的根给出。

我仍然在递归算法上苦苦挣扎,我不明白为什么这个算法不返回任何东西。

请注意,我的问题不是关于我提出的算法的正确性或效率(尽管这方面的 cmets 也很受欢迎)。

编辑:我已经编辑了代码,试图按照建议包含基本情况。

【问题讨论】:

  • 确保你正在为你认为你正在准备的东西做准备。根据公司的类型,这可能是一个非常常见的面试问题......或者一个非常常见的问题。
  • 目前我对问题的类型不太感兴趣,而对能够实现这样或那样的算法更感兴趣。由于 CTCI 非常基础,我相信从算法的角度来看,我更关心的是代码本身。
  • 还不错,态度很好。
  • 基本情况在哪里?当两个条件都为 False 时会发生什么?放入一些打印功能,看看发生了什么。
  • @wwii 我已尝试将其包含在内。仍然为遇到的每个根的孩子返回“无”。

标签: python recursion binary-search-tree


【解决方案1】:

minimalTree 函数需要更正

需要一个在数组为空时返回的基本情况

if lengthArray == 0:
  return None

需要递归赋值左右(独立于中间)

# Array split a middle
leftArray = sortedArray[0:middle]
rightArray = sortedArray[middle+1:lengthArray]

# Left side recursion
root.left = minimalTree(leftArray)

# Right side recursion
root.right = minimalTree(rightArray)

你需要返回root

return root

以上重构后的minimalTree代码

def minimalTree(sortedArray):
    lengthArray = len(sortedArray)

    # Base case of recursion
    if lengthArray == 0:
      return None

    # Assign middle
    middle = lengthArray//2
    root = Node(sortedArray[middle])

    # Split Left & Right sides
    leftArray = sortedArray[0:middle]
    rightArray = sortedArray[middle+1:lengthArray]

    # Left & right recursions
    root.left = minimalTree(leftArray)
    root.right = minimalTree(rightArray)

    return root

显示树

def display(node): 
    if not node: 
        return

    print (node.value)
    display(node.left)
    display(node.right)

测试

tree = minimalTree([1, 2, 3, 4, 5])
display(tree)

输出

3
2
1
5
4

【讨论】:

  • @glmd--不确定我是否清楚。有意义吗?
  • 有没有办法知道递归函数是否应该返回“自身”(带有递归参数),或者其他什么? (希望我的问题有意义)。
  • @GLMD--递归程序通常是自上而下的,这意味着您轮流表达问题的子问题。递归函数返回以回答子问题。在这种情况下,构造的树节点具有三个组件:1)值,2)左,3)右。价值只是中间的价值。但是,我们使用递归来获得左右。递归函数必须返回它们的节点值,以便我们可以进行左右分配。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
相关资源
最近更新 更多