5.3.4 实践演练——使用嵌套列表表示树

下面的实例文件qian.py演示了使用嵌套列表表示树的过程。

源码路径:daima\第5章\qian.py

(1)通过如下代码构建一棵二叉树,该二叉树只是构建包含一个根节点和两个空子节点的列表。为了将左子树添加到树的根,我们需要插入一个新的列表到根列表的第二个位置。我们必须注意,如果列表中已经有值在第二个位置,我们需要跟踪它,将新节点插入树中作为其直接的左子节点。

def BinaryTree(r):
    return [r, [], []]

(2)通过如下insertLeft()函数插入一个左子节点,首先判断当前左子节点的列表(可能是空的)长度是否大于1。如果大于1,在添加新的左子节点后,将原来的左子节点作为新节点的左子节点。这使我们能够将新节点插入到树中的任何位置。

def insertLeft(root,newBranch):
     t = root.pop(1)
     if len(t) > 1:
          root.insert(1,[newBranch,t,[]])
     else:
          root.insert(1,[newBranch, [], []])
     return root

(3)通过如下代码插入一个右子节点,具体原理和上面的插入左子节点相同。

def insertRight(root,newBranch):
     t = root.pop(2)
     if len(t) > 1:
          root.insert(2,[newBranch,[],t])
     else:
          root.insert(2,[newBranch,[],[]])
     return root

(4)为了完善树的实现,编写如下几个用于获取和设置根值的函数,以及几个用于获得左边或右边子树的函数。

def getRootVal(root):
     return root[0]
def setRootVal(root,newVal):
     root[0] = newVal
def getLeftChild(root):
     return root[1]
def getRightChild(root):
     return root[2]

(5)通过如下代码进行测试:

r = BinaryTree('a')
print(r.getRootVal())
print(r.getLeftChild())
r.insertLeft('b')
print(r.getLeftChild())
print(r.getLeftChild().getRootVal())
r.insertRight('c')
print(r.getRightChild())
print(r.getRightChild().getRootVal())
r.getRightChild().setRootVal('hello')
print(r.getRightChild().getRootVal())

执行后会输出:

a
None
<__main__.BinaryTree object at 0x00000221FC779AC8>
b
<__main__.BinaryTree object at 0x00000221FC779B00>
c
hello