数据结构算法之二叉树

November 13, 2017

数据结构面试中经常会被问到篇二叉树相关的问题,那么这篇文章会研究下怎么用python来进行二叉树的构建和遍历。

注意:py2中

print root.elem,

在py3中要换成

print (root.elem,end="  ")
# coding:utf-8

# 定义节点类
class Node:
    def __init__(self,elem = -1,):
        self.elem = elem
        self.left = None
        self.right = None
        
# 定义二叉树
class Tree:
    def __init__(self):
        self.root = Node()
        self.myqu = []
    
    # 添加节点
    def add(self,elem):
        node = Node(elem)
        if self.root.elem == -1:         # 判断如果是根节点
            self.root  = node
            self.myqu.append(self.root)
        else:
            treenode = self.myqu[0]
            if treenode.left == None:
                treenode.left = node
                self.myqu.append(treenode.left)
            else:
                treenode.right = node
                self.myqu.append(treenode.right)
                self.myqu.pop(0)
        
    # 利用递归实现树的先序遍历
    def xianxu(self,root):
        if root == None:
            return
        print root.elem,
        self.xianxu(root.left)
        self.xianxu(root.right)
        
    # 利用递归实现树的中序遍历
    def zhongxu(self,root):
        if root == None:
            return 
        self.zhongxu(root.left)
        print root.elem,
        self.zhongxu(root.right)
        
    # 利用递归实现树的后序遍历
    def houxu(self,root):
        if root == None:
            return 
        self.houxu(root.left)
        self.houxu(root.right)
        print root.elem,
    
    # 利用队列实现层次遍历
    def cengci(self,root):
        if root == None:
            return
        myq = []
        node = root
        myq.append(node)
        while myq:
            node = myq.pop(0)
            print node.elem,
            if node.left != None:
                myq.append(node.left)
            if node.right != None:
                myq.append(node.right)
    
    # 求树的叶子节点
    def getYeJiedian(self,root):
        if root == None:
            return 0
        if root.left == None and root.right == None:
            return 1

        return self.getYeJiedian(root.left) + self.getYeJiedian(root.right)

    # 由先序和中序,还原二叉树
    def preMidToHou(self,pre,mid):
        if len(pre)==0:
            return None
        if len(pre)==1:
            Node(mid[0])
        root = Node(pre[0])
        root_index = mid.index(pre[0])
        root.left = self.preMidToHou(pre[1:root_index + 1],mid[:root_index])
        root.right = self.preMidToHou(pre[root_index + 1:],mid[root_index + 1:])
        return root

    # 由后序和中序,还原二叉树
    def preMidToHou(self,mid,hou):
        if len(hou)==0:
            return None
        if len(hou)==1:
            Node(mid[0])
        root = Node(hou[-1])
        root_index = mid.index(hou[-1])
        root.left = self.preMidToHou(mid[:root_index],hou[:root_index])
        root.right = self.preMidToHou(mid[root_index + 1:],mid[root_index + 1:])
        return root

# 创建一个树,添加节点
tree = Tree()
for i in range(10):
    tree.add(i)
    
print("二叉树的先序遍历:")
print(tree.xianxu(tree.root))

print("二叉树的中序遍历:")
print(tree.zhongxu(tree.root))

print("二叉树的后序遍历:")
print(tree.houxu(tree.root))

print("二叉树的层次遍历")
print(tree.cengci(tree.root))

print("\n二叉树的叶子节点为:")
print(tree.getYeJiedian(tree.root))

print("\n已知二叉树先序遍历和中序遍历,求后序:")
print("先序:")
print(tree.xianxu(tree.root))
print("中序:")
print(tree.zhongxu(tree.root))
print("后序:")
root = tree.preMidToHou([0,1,3,7,8,4,9,2,5,6],[7,3,8,1,9,4,0,5,2,6])
print(tree.houxu(root))

print("\n已知二叉树后序遍历和中序遍历,求前序:")
print("后序:")
print(tree.houxu(tree.root))
print("中序:")
print(tree.zhongxu(tree.root))
print("前序:")
root = tree.preMidToHou([7,3,8,1,9,4,0,5,2,6],[7,8,3,9,4,1,5,6,2,0])
print(tree.xianxu(root))

运行结果为:

二叉树的先序遍历:
0 1 3 7 8 4 9 2 5 6 None

二叉树的中序遍历:
7 3 8 1 9 4 0 5 2 6 None

二叉树的后序遍历:
7 8 3 9 4 1 5 6 2 0 None

二叉树的层次遍历
0 1 2 3 4 5 6 7 8 9 None

二叉树的叶子节点为:
5

已知二叉树先序遍历和中序遍历,求后序:
先序:
0  1  3  7  8  4  9  2  5  6  None
中序:
7  3  8  1  9  4  0  5  2  6  None
后序:
1  3  7  8  4  9  0  5  2  6  None

已知二叉树后序遍历和中序遍历,求前序:
后序:
7  8  3  9  4  1  5  6  2  0  None
中序:
7  3  8  1  9  4  0  5  2  6  None
前序:
0  1  3  7  8  4  9  6  2  5  None