You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Record Structure的二叉树程序仅能添加一个元素排查求助

问题:数组实现二叉树仅能添加一个元素

我依据剑桥国际A&AS Level教材编写了一个使用Record Structure实现Binary Tree的程序(考试要求必须使用该结构),但程序运行时仅能添加一个元素,尽管数组支持最多8个元素。期望程序能添加最多8个元素并支持查找功能,自行排查未发现错误,恳请帮忙定位问题所在。

代码如下:

NULLPOINTER = -1

class TreeNode:
    def __init__(self):
        self.Data= ""
        self.LeftPointer = NULLPOINTER
        self.RightPointer = NULLPOINTER

def InialiseTree():
    Tree = [TreeNode() for i in range(8)]
    RootPointer = NULLPOINTER
    FreePtr = 0
    for Index in range(7):
        Tree[Index].leftPointer = Index+1
    return (Tree, RootPointer, FreePtr)

def InsertNode(Tree, RootPointer, FreePtr, NewItem):
    if FreePtr !=NULLPOINTER:#there is space in the array, 
        NewNodePtr = FreePtr #take node from free list and store there
        Tree[NewNodePtr].Data = NewItem
        FreePtr=Tree[FreePtr].LeftPointer
        Tree[NewNodePtr].LeftPointer= NULLPOINTER
        if RootPointer ==NULLPOINTER:
            RootPointer = NewNodePtr
        else:
            ThisNodePtr = RootPointer
            while ThisNodePtr != NULLPOINTER:
                PreviousNodePtr=ThisNodePtr
                if Tree[ThisNodePtr].Data>NewItem:
                    TurnedLeft = True
                    ThisNodePtr=Tree[ThisNodePtr].LeftPointer
                else:
                    TurnedLeft = False
                    ThisNodePtr=Tree[ThisNodePtr].RightPointer
            if TurnedLeft:
                Tree[PreviousNodePtr].LeftPointer=NewNodePtr
            else:
                Tree[PreviousNodePtr].RightPointer=NewNodePtr
    else:
        print("No space for more data")
    return (Tree, RootPointer, FreePtr)
            
def TraverseTree(Tree, RootPointer):
  if RootPointer != NULLPOINTER:
    TraverseTree(Tree, Tree[RootPointer].LeftPointer)
    print(Tree[RootPointer].Data)
    TraverseTree(Tree, Tree[RootPointer].RightPointer)


def GetOption():
  print("1: add data")
  print("2: find data")
  print("3: traverse data")
  print("4: end program")
  option = input("Enter your choice: ")
  return (option)

def FindNode(Tree, RootPointer, SearchItem):
  ThisNodePtr= RootPointer
  while ThisNodePtr!= NULLPOINTER and Tree[ThisNodePtr].Data!=SearchItem:
    if Tree[ThisNodePtr].Data>SearchItem:
      ThisNodePtr = Tree[ThisNodePtr].LeftPointer
    else:
      ThisNodePtr = Tree[ThisNodePtr].RightPointer
  return (ThisNodePtr)
  
#main program
Tree, RootPointer, FreePtr = InialiseTree()
Option=GetOption()
while Option !=4:
  if Option == "1":
    Data = input("Enter the value: ")
    Tree, RootPointer, FreePtr = InsertNode(Tree, RootPointer, FreePtr, Data)
    TraverseTree(Tree, RootPointer)
  elif Option=="2":
    Data = input("Enter search value: ")
    ThisNodePtr= FindNode(Tree, RootPointer, Data)
    if ThisNodePtr==NULLPOINTER:
      print("Value not found")
    else:
      print("VAlue found at ", ThisNodePtr)
    print(RootPointer, FreePtr)
    for i in range (8):
      print(i, "  ", Tree[i].LeftPointer, "  ", Tree[i].Data, Tree[i].RightPointer, "  " )
  elif Option =="3":
    TraverseTree(Tree, RootPointer)  
  Option = GetOption()

错误定位与修复

问题出在InialiseTree函数中的属性大小写不匹配:

  • TreeNode类定义的左指针属性是LeftPointer(首字母大写L)
  • 但初始化循环中错误地使用了Tree[Index].leftPointer(首字母小写l),这会给每个节点新增一个名为leftPointer的属性,而非修改原本的LeftPointer

这导致首次插入元素后,FreePtr被设置为Tree[FreePtr].LeftPointer(即初始的NULLPOINTER),程序误以为数组已满,无法继续插入新元素。

修复方法:修改InialiseTree函数中的循环语句,将leftPointer改为LeftPointer:

def InialiseTree():
    Tree = [TreeNode() for i in range(8)]
    RootPointer = NULLPOINTER
    FreePtr = 0
    for Index in range(7):
        Tree[Index].LeftPointer = Index+1  # 修正大小写
    return (Tree, RootPointer, FreePtr)

另外,代码中还有一处拼写错误:InialiseTree应为InitializeTree(符合英文拼写规范),但如果是教材要求的写法,可保留原名称。

修复后,程序即可正常插入最多8个元素,同时查找功能也能正常工作。

内容的提问来源于stack exchange,提问作者Naushin Mirza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:45:34