列表索引超出范围-BST的预遍历

时间:2020-08-07 21:01:03

标签: python algorithm tree binary-search-tree traversal

我试图对遍历以数组形式获取的BST进行预排序: enter image description here

示例输入: ["5","2","6","1","9","#","8","#","#","#","#","4","#"],其中#是树中不存在的节点

我的输出应该是预定遍历的结果:

5 2 1 9 6 8 4

到目前为止,除最后一个节点外,我都成功了,但索引超出了范围。 到目前为止,这是我的代码:

 def traverse(strArr):
  strArr.insert(0, '#')

  def preorder(arr, ind):
    if ind <= len(arr) and arr[ind] != '#':
      print(arr[ind])
      preorder(arr, 2*ind)
      preorder(arr, 2*ind+1)

  preorder(strArr, 1)

traverse(["5","2","6","1","9","#","8","#","#","#","#","4","#"])

为了使最后一个节点(在本例中为4个)无错误显示,我需要更改什么?

1 个答案:

答案 0 :(得分:1)

有两个问题。

  1. 数组从零开始: if ind <= len(arr) and arr[ind] != '#':允许ind成为len(arr),它比arr的最后一个元素的索引大。在同一行中,您使用ind作为索引来访问数组arr[ind],这将导致IndexError。此处的解决方法是检查ind是否小于 len(arr)
if ind < len(arr) and arr[ind] != '#':
  1. 4的索引错误: 当前位于索引11,但应位于索引13。在此处修复:
traverse(["5","2","6","1","9","#","8","#","#","#","#","#","#","4","#"])