首页 > 其他分享 >二叉树

二叉树

时间:2023-01-23 23:11:37浏览次数:34  
标签:node None 遍历 return cur self 二叉树

  二叉树是由n个节点构成,它有可能是空树,也有可能是非空树。

  对于非空树,有且仅有一个根节点,和左右两个不相交的左子树和右子树

  左子树和右子树有左右之分,不可颠倒

  二叉树的遍历法;

  1.深度优先法

    前序遍历,访问根节点,遍历左子树,再遍历右子树

    中序遍历,遍历左子树,访问根节点,再遍历右子树

    后序遍历,遍历左子树,遍历右子树,再访问根节点

  2.广度优先法

    层级遍历,从根节点开始一层一层的自左向右遍历节点    

 

  代码实现:

  

# -*- coding = utf-8 -*-
# @Author: Wchime
# @time: 2023/1/23 14:09
# @file: 二叉树.py


class Node(object):
    """
    树节点,包含值和左右子节点
    """
    def __init__(self, item):
        self.item = item
        self.lchild = None
        self.rchild = None


class Tree(object):
    """
    二叉树
    """
    def __init__(self):
        self.__root = None

    def is_empty(self):
        """
        判断树是否为空
        :return:
        """
        return self.__root is None

    def append(self, item):
        """
        添加节点
        :param item:
        :return:
        """
        node = Node(item)

        if self.is_empty():
            self.__root = node
            return
        else:
            li = [self.__root]
            while li:
                cur = li.pop(0)
                if cur.lchild is None:
                    cur.lchild = node
                    return
                else:
                    li.append(cur.lchild)
                if cur.rchild is None:
                    cur.rchild = node
                    return
                else:
                    li.append(cur.rchild)

    def travel_preorder(self):
        """
        先序遍历
        :return:
        """
        def recur(node):
            """
            递归
            :return:
            """
            if node is None:
                # print('None')
                return
            print(node.item, end="  ")
            recur(node.lchild)
            recur(node.rchild)

        recur(self.__root)
        print('\n')

    def travel_inorder(self):
        """
        中序遍历
        :return:
        """
        def recur(node):
            """
            递归
            :return:
            """
            if node is None:
                # print('None')
                return
            recur(node.lchild)
            print(node.item, end="  ")
            recur(node.rchild)

        recur(self.__root)
        print('\n')

    def travel_postorder(self):
        def recur(node):
            """
            递归
            :return:
            """
            if node is None:
                # print('None')
                return
            recur(node.lchild)
            recur(node.rchild)
            print(node.item, end="  ")

        recur(self.__root)
        print('\n')

    def travel_breadth(self):
        """
        广度优先遍历
        :return:
        """
        if self.__root is None:
                return

        li = [self.__root]
        while li:
            cur = li.pop(0)
            print(cur.item, end="  ")
            if cur.lchild is not None:
                li.append(cur.lchild)
            if cur.rchild is not None:
                li.append(cur.rchild)
        print('\n')


if __name__ == "__main__":
    tree = Tree()
    print(tree.is_empty())
    tree.append(3)
    tree.append(7)
    tree.append(9)
    tree.append(5)
    tree.append(2)
    tree.append(1)
    tree.travel_preorder()
    tree.travel_inorder()
    tree.travel_postorder()

    tree.travel_breadth()

 

 

    

标签:node,None,遍历,return,cur,self,二叉树
From: https://www.cnblogs.com/moon3496694/p/17065656.html

相关文章

  • WeetCode4 —— 二叉树遍历与树型DP
    一丶二叉树的遍历1.二叉树遍历递归写法与递归序了解过二叉树的朋友,最开始肯定是从二叉树的遍历开始的,二叉树遍历的递归写法想必大家都有所了解。publicstaticvoidpro......
  • 刷刷刷 Day 17 | 257. 二叉树的所有路径
    257.二叉树的所有路径LeetCode题目要求给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例输入:roo......
  • 刷刷刷 Day 17 | 110. 平衡二叉树
    110.平衡二叉树LeetCode题目要求给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值......
  • 刷刷刷 Day 16 | 222. 完全二叉树的节点个数
    222.完全二叉树的节点个数LeetCode题目要求给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外......
  • 算法编程 dfs 从先序和中序遍历还原二叉树
    105.从前序与中序遍历序列构造二叉树给定两个整数数组 preorder和inorder ,其中 preorder是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回......
  • 刷刷刷 Day 16 | 111. 二叉树的最小深度
    111.二叉树的最小深度LeetCode题目要求给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点......
  • 刷刷刷 Day 16 | 104. 二叉树的最大深度
    104.二叉树的最大深度LeetCode题目要求给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节......
  • 刷刷刷 Day | 101. 对称二叉树
    101.对称二叉树LeetCode题目要求给你一个二叉树的根节点root,检查它是否轴对称。示例输入:root=[1,2,2,3,4,4,3]输出:true解题思路通过分别遍历左右两个子树......
  • 刷刷刷 Day 15| 226. 翻转二叉树
    226.翻转二叉树LeetCode题目要求给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点示例输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]解题思路基本......
  • 刷刷刷 Day15 | 102. 二叉树的层序遍历
    102.二叉树的层序遍历LeetCode题目要求给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例输入:root=[3,9,20,null,null,1......