数据结构与算法_渡劫7_二叉树

一、概念

在这里插入图片描述

  1. 树结构是一种包括节点(nodes)和边(edges)的拥有层级关系的一种结构

二、二叉树

  1. 二叉树是一种简单的树,它的每个节点最多只能包含两个孩子

二叉树

其中,2是满二叉树,3是完全二叉树

满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树

三、二叉树的表示 & 遍历

3.1 二叉树的表示

  1. 首先定义一个类表示节点

     class Node(object):
          def __init__(self, val=None, left=None, right=None):
              self.val = val
              self.left = left
              self.right = right
    
    class BinTree(obeject):
        def __init__(self):
            self.root = None
    
  2. 创建一棵树

    def add(self, elem):
        '''创建二叉树'''
        node = Node(elem)
        # 如果根节点为空,则elem作为根节点
        if not self.root:
            self.root = node
            return
        # 根节点入队
        queue = [self.root]
        while queue:
            # 父节点出队
            par_node = queue.pop(0)
            # 左节点不存在时,将elem 作为左节点,否则左节点入队
            if not par_node.left:
                par_node.left = node
                return
            else:
                queue.append(par_node.left)
                # 右节点不存在时,将elem 作为右节点,否则右节点入队
            if not par_node.right:
                par_node.right = node
                return
            else:
                queue.append(par_node.right)
    

3.2 二叉树的遍历

  • 前序遍历: 根节点->左子树->右子树

    def pre_order(self, node):
        """前序遍历"""
        if not node:
            return None
        print(node)
        self.pre_order(node.left)
        self.pre_order(node.right)
    
  • 中序遍历: 左子树->根节点->右子树

    def mid_order(self, node):
        """中序遍历"""
        if not node:
            return None
        self.mid_order(node.left)
        print(node)
        self.mid_order(node.right)
    
  • 后序遍历: 左子树->右子树->根节点

    def post_order(self, node):
        """后序遍历"""
        if not node:
            return None
        self.post_order(node.left)
        self.post_order(node.right)
        print(node)
    
  • 层序遍历(队列实现)

    def layer_order(self):
        """层序遍历"""
        if not self.root:
            return None
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node)
            if cur_node.left:
                queue.append(cur_node.left)
            if cur_node.right:
                queue.append(cur_node.right)
    
  • 完整代码:

    # coding=utf-8
    '''
    @ Summary: 递归遍历二叉树
    @ Update:  
    
    @ file:    4-1.二叉树的遍历.py
    @ version: 1.0.0
    
    @ Author:  Lebhoryi@gmail.com
    @ Date:    19-11-1 下午7:51
    '''
    import pysnooper
    
    class Node(object):
        def __init__(self, val):
            self.val = val
            self.left = None
            self.right = None
    
        def __repr__(self):
            return str(self.val)
    
    class BinTree(object):
        """二叉树"""
        def __init__(self):
            self.root = None
    
        # @pysnooper.snoop(watch="queue")
        def add(self, elem):
            '''创建二叉树'''
            node = Node(elem)
            # 如果根节点为空,则elem作为根节点
            if not self.root:
                self.root = node
                return
            # 根节点入队
            queue = [self.root]
            while queue:
                # 父节点出队
                par_node = queue.pop(0)
                # 左节点不存在时,将elem 作为左节点,否则左节点入队
                if not par_node.left:
                    par_node.left = node
                    return
                else:
                    queue.append(par_node.left)
                # 右节点不存在时,将elem 作为右节点,否则右节点入队
                if not par_node.right:
                    par_node.right = node
                    return
                else:
                    queue.append(par_node.right)
    
    
        def layer_order(self):
            """层序遍历"""
            if not self.root:
                return None
            queue = [self.root]
            while queue:
                cur_node = queue.pop(0)
                print(cur_node)
                if cur_node.left:
                    queue.append(cur_node.left)
                if cur_node.right:
                    queue.append(cur_node.right)
    
        def pre_order(self, node):
            """前序遍历"""
            if not node:
                return None
            print(node)
            self.pre_order(node.left)
            self.pre_order(node.right)
    
        def mid_order(self, node):
            """中序遍历"""
            if not node:
                return None
            self.mid_order(node.left)
            print(node)
            self.mid_order(node.right)
    
        def post_order(self, node):
            """后序遍历"""
            if not node:
                return None
            self.post_order(node.left)
            self.post_order(node.right)
            print(node)
    
    
    if __name__=="__main__":
        tree = BinTree()
        for i in range(65,72):
            tree.add(chr(i))
        # tree.layer_order()
        # tree.pre_order(tree.root)
        # tree.mid_order(tree.root)
        tree.post_order(tree.root)
    

四、代码练习

  1. 左右反转二叉树
  2. 给定前序和后序构造二叉树
  3. 验证搜索二叉树
  4. 二叉树的最近公共祖先
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值