Python 数据结构 ---- 08 二叉树实现

1. 二叉树实现

Python 数据结构 ---- 08 二叉树实现

Python 数据结构 ---- 08 二叉树实现 

myTree = ['a',  #root
          ['b',  #left subtree
           ['d',[],[]],
           ['e',[],[]]
           ],
          ['c',# right subtree
           ['f',[],[]],
           []
           ]
          ]
print("root",myTree[0])
print("left subtree",myTree[1])
print("right subtree",myTree[2])

C:\Users\Amber\PycharmProjects\untitled5\venv\Scripts\python.exe C:/Training/AI/Python/二叉树.py
root a
left subtree ['b', ['d', [], []], ['e', [], []]]
right subtree ['c', ['f', [], []], []]

Python 数据结构 ---- 08 二叉树实现

 Python 数据结构 ---- 08 二叉树实现

def BinaryTree(r):
    return [r,[],[]]   # 返回根节点r,和两个空子节点的函数

def insertLeft(root,newBranch):
    t=root.pop(1)
    if len(t)>1: # 左子节点的列表不为空,原来的左子节点仍然为左子节点
        root.insert(1,[newBranch,t,[]])
    else:# 左子节点的列表为空,新的左子节点直接插入
        root.insert(1, [newBranch, [], []])
    return root

def insertRight(root,newBranch):
    t=root.pop(2)
    if len(t)>1: # 左子节点的列表不为空
        root.insert(2,[newBranch,[],t])
    else:
        root.insert(1, [newBranch, [], []])
    return root

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]

tree = BinaryTree('a')
insertLeft(tree,'b')
insertRight(tree,'c')
insertLeft((getLeftChild(tree)),'d')
insertRight((getLeftChild(tree)),'e')
insertLeft((getRightChild(tree)),'f')
print(tree)

C:\Users\Amber\PycharmProjects\untitled5\venv\Scripts\python.exe C:/Training/AI/Python/二叉树02.py
['a', ['c', ['e', [], []], ['d', [], []]], ['b', ['f', [], []], []]]

2. 二叉树遍历

Python 数据结构 ---- 08 二叉树实现

# 先序遍历, 遍历顺序是从根节点开始,子节点顺序是从左向右,垂直深度优先,水平顺序次优
def preorder(tree):
    if tree != []:
        print(tree[0],end='')  #对根的访问
        preorder(tree[1])     #对左子树的访问
        preorder(tree[2])     #对右子树的访问

tree=['a',   #根节点
      ['b',  #左子树
       ['d',[],[]],
       ['e',[],[]]],
       ['c',  #Right subtree
        ['f',[],[]],
        []]
       ]

preorder(tree)

C:\Users\Amber\PycharmProjects\untitled5\venv\Scripts\python.exe C:/Training/AI/Python/二叉树03.py
abdecf

 

 Python 数据结构 ---- 08 二叉树实现

# 中序遍历, 遍历顺序是从左边深度最长的子节点开始,逐步从左到右遍历
def inorder(tree):
    if tree != []:
        inorder(tree[1])     #对左子树的访问
        print(tree[0],end='')  #对根的访问
        inorder(tree[2])     #对右子树的访问

tree=['a',   #根节点
      ['b',  #左子树
       ['d',[],[]],
       ['e',[],[]]],
       ['c',  #Right subtree
        ['f',[],[]],
        []]
       ]

inorder(tree)

C:\Users\Amber\PycharmProjects\untitled5\venv\Scripts\python.exe C:/Training/AI/Python/二叉树04.py
dbeafc

 

Python 数据结构 ---- 08 二叉树实现 

# 后序遍历, 遍历顺序是从左边深度最长的子节点开始,逐步从下到上遍历
def postorder(tree):
    if tree != []:
        postorder(tree[1])     #对左子树的访问
        postorder(tree[2])     #对右子树的访问
        print(tree[0],end='')  #对根的访问


tree=['a',   #根节点
      ['b',  #左子树
       ['d',[],[]],
       ['e',[],[]]],
       ['c',  #Right subtree
        ['f',[],[]],
        []]
       ]

postorder(tree)

C:\Users\Amber\PycharmProjects\untitled5\venv\Scripts\python.exe C:/Training/AI/Python/二叉树05.py
debfca

Python 数据结构 ---- 08 二叉树实现

# 计算二叉树节点个数
# 当树为空时,节点个数为0
# 否则,节点总数为根节点个数+左节点个数+右节点个数
def count(root):
    if root == []:
        return 0
    else:
        n1=count(root[1])
        n2=count(root[2])
        n = 1 + n1 + n2
        return n

tree=['a',   #根节点
      ['b',  #左子树
       ['d',[],[]],
       ['e',[],[]]],
       ['c',  #Right subtree
        ['f',[],[]],
        []]
       ]

sum = count(tree)
print(sum)

C:\Users\Amber\PycharmProjects\untitled5\venv\Scripts\python.exe C:/Training/AI/Python/二叉树06.py
6


3. 二叉树排序