zoukankan      html  css  js  c++  java
  • 二叉树的实现

    二叉树的实现:

    1. 广度遍历
    2. 深度遍历
      1. 先序遍历: 根, 左, 右
      2. 中序遍历: 左, 根, 右
      3. 后续遍历: 左, 右, 根

    简洁版:

    class Node(object):
        def __init__(self, item):
            self.elem = item
            self.lchild = None
            self.rchild = None
    
    
    class Binary_Tree(object):
        def __init__(self):
            self.root = None
    
        def add(self, item):
            node = Node(item)
            if self.root is None:
                self.root = node
                return
            queue = [self.root]
            while queue:
                cur_node = queue.pop(0)
                if cur_node.lchild is None:
                    cur_node.lchild = node
                    return
                else:
                    queue.append(cur_node.lchild)
                if cur_node.rchild is None:
                    cur_node.rchild = node
                    return
                else:
                    queue.append(cur_node.rchild)
        def breadth_travel(self):
            if self.root is None:
                return None
            queue = [self.root]
            while queue:
                cur_node = queue.pop(0)
                print(cur_node.elem, end=" ")
                if cur_node.lchild is not None:
                    queue.append(cur_node.lchild)
                if cur_node.rchild is not None:
                    queue.append(cur_node.rchild)
        def preorder(self, node):
            """先序遍历, 根,左,右"""
            if node is None:
                return
            print(node.elem, end=" ")
            self.preorder(node.lchild)
            self.preorder(node.rchild)
    
        def inorder(self, node):
            """中序遍历: 左,根,右"""
            if node is None:
                return
            self.inorder(node.lchild)
            print(node.elem, end=" ")
            self.inorder(node.rchild)
    
        def posorder(self, node):
            """后续遍历: 左,右,根"""
            if node is None:
                return
            self.posorder(node.lchild)
            self.posorder(node.rchild)
            print(node.elem, end=" ")
    View Code

    注释版:

    class Node(object):
        # 节点类
        def __init__(self, item):
            # 初始化函数, 将传递进来的元素, 创建成新节点的elem
            self.elem = item
            self.lchild = None
            # 新节点的lchild左孩子, 默认为None
            self.rchild = None
            # 新节点的rchild右孩子, 默认为None
    
    
    class Binary_Tree(object):
        # 二叉树类
        def __init__(self):
            self.root = None
            # 默认情况下树的根节点为None, 即: 空树
            # 只能通过add添加节点
    
        def add(self, item):
            node = Node(item)
            # 将要插入的元素创建新节点
    
    
            # 添加节点用广度遍历, 从根节点root开始遍历
            # cur_node代表当前节点, 从队列的头部取出节点
            if self.root is None:
                # 如果是空树, 则直接将元素当作根节点插入, 然后退出
                self.root = node
                return
            queue = [self.root]
            while queue:
                # 如果队列不为空, 一直执行
                # 创建队列, 内含树的根节点
                cur_node = queue.pop(0)
                if cur_node.lchild is None:
                    # 如果当前节点的左孩子不存在, 将新对象插入到左孩子位置, 然后退出
                    cur_node.lchild = node
                    return
                else:
                    # 如果当前节点的左孩子存在, 将左孩子添加到队列中
                    queue.append(cur_node.lchild)
                if cur_node.rchild is None:
                    # 如果当前节点的右孩子不存在, 将新对象插入到右孩子位置, 然后退出
                    cur_node.rchild = node
                    return
                else:
                    # 如果当前节点的右孩子存在, 将右孩子添加到队列内
                    queue.append(cur_node.rchild)
        def breadth_travel(self):
            """广度遍历"""
    
            if self.root is None:
                # 如果树为空, 直接返回
                return None
            queue = [self.root]
            while queue:
                # 如果队列不为空
                cur_node = queue.pop(0)
                # 从队列中取出一个节点
                print(cur_node.elem, end=" ")
                # 打印当前节点的elem
                if cur_node.lchild is not None:
                    # 如果当前节点的左孩子存在, 添加到队列内
                    queue.append(cur_node.lchild)
                if cur_node.rchild is not None:
                    # 如果当前节点的右孩子存在, 添加到队列内
                    queue.append(cur_node.rchild)
        def preorder(self, node):
            """先序遍历, 每次传递进来的根  都不一样"""
            # 按照(根, 左, 右)的顺序来递归调用先序遍历函数
            if node is None:
                # 如果当前节点为None, 退出
                return
            print(node.elem, end=" ")
            self.preorder(node.lchild)
            self.preorder(node.rchild)
    
        def inorder(self, node):
            """中序遍历, 每次传递进来的根  都不一样"""
            # 按照(左, 根, 右)的顺序来递归调用先序遍历函数
            if node is None:
                # 如果当前节点为None, 退出
                return
            self.inorder(node.lchild)
            print(node.elem, end=" ")
            self.inorder(node.rchild)
    
        def posorder(self, node):
            """后续遍历, 每次传递进来的根  都不一样"""
            # 按照(左, 右,  根)的顺序来递归调用先序遍历函数
            if node is None:
                # 如果当前节点为None, 退出
                return
            self.posorder(node.lchild)
            self.posorder(node.rchild)
            print(node.elem, end=" ")
    
    
    if __name__ == "__main__":
        tree = Binary_Tree()
        for i in range(0, 10):
            tree.add(i)
            # print(i, end=" ")
        tree.breadth_travel()
        print(" ")
        tree.preorder(tree.root)
        print(" ")
        tree.inorder(tree.root)
        print(" ")
        tree.posorder(tree.root)
        print(" ")
    View Code

    确定一颗完全二叉树:

    先序: 根, 左, 右
    中序: 左, 右, 根
    后序: 左, 根, 右

    前提条件:

    1. 给出先序中序
    2. 给出后序中序
  • 相关阅读:
    Codeforces 1381B Unmerge(序列划分+背包)
    daily overview(2020.03.07update:该网站打不开惹
    矩阵相关
    颓式子
    51nod 1603 限高二叉排列树/1412 AVL树的种类
    模板合集(未完
    【luogu5651】 基础最短路练习题 [?]
    一个大Za
    【2019.11.11】
    【noip2017】
  • 原文地址:https://www.cnblogs.com/amou/p/9060839.html
Copyright © 2011-2022 走看看