首页 > 其他分享 >二叉树

二叉树

时间:2023-01-10 19:44:58浏览次数:40  
标签:遍历 self 节点 二叉树 root order

1. 二叉树的概念

  二叉树是n个有限元素的集合,该集合或为空、或由一个根节点及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。二叉树又分为满二叉树和完全二叉树

  满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树

  完全二叉树:完全二叉树是由满二叉树引出的。满二叉树要求每一层的节点数都达到最大值,完全二叉树仅要求除最后一层外的节点数达到最大值,也就是说最后一层可以不满。我们可以把满二叉树看错特殊的完全二叉树。

  

 

 

2. 二叉树的遍历

  

 

  代码实现: 

# 构建节点类
class BiTreeNode:
    def __init__(self, item):
        self.item = item
        self.leftChild = None
        self.rightChild = None

# 创建树节点
a = BiTreeNode('A')
b = BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')

# 模拟树
e.leftChild = a
e.rightChild = g
a.rightChild = c
c.leftChild = b
c.rightChild = d
g.rightChild = f
# 根节点
root = e

from collections import deque
# 遍历树类
class ForInBiTree:
    # 前序遍历:以根节点为中点分为左右两边,从根节点出发先遍历左边在遍历右边,从上左右原则
    def pre_order(self, root):
        # 判断是否是一个空树
        if root:
            print(root.item, end=',')           # 先遍历根节点
            self.pre_order(root.leftChild)      # 递归传入左节点为参数,即往左边走
            self.pre_order(root.rightChild)     # 递归传入右节点为参数,没有左子树,在往右走

    # 中序遍历:以根节点为中心点,先遍历左边在到根节点再遍历左边,先左上右原则
    def cen_order(self, root):
        if root:
            self.cen_order(root.leftChild)      # 递归传入左节点为参数,即往左边走
            print(root.item, end=',')           # 没有左子树则遍历自己
            self.cen_order(root.rightChild)     # 在往右进行遍历

    # 后序遍历:以根节点为中心点,先遍历左边再遍历右边再根节点,从左右上原则
    def later_order(self, root):
        if root:
            self.later_order(root.leftChild)    # 先找左边的子节点
            self.later_order(root.rightChild)   # 在找优点的子节点
            print(root.item, end=',')           # 没有则输出当前根节点

    # 层次遍历:从根节点开始,从上往下开始遍历
    def level_order(self, root):
        # 利用队列的先进先出原则
        queue = deque()
        queue.append(root)      # 根节点进入队列
        while len(queue) > 0:   # 当队列中存在元素则说明还有子节点
            node = queue.popleft()      # 当前根节点指向出队列的节点
            print(node.item, end=',')
            # 按照从左往右的顺序加入队列
            if node.leftChild:
                queue.append(node.leftChild)
            if node.rightChild:
                queue.append(node.rightChild)

forInBiTree = ForInBiTree()
# 前序遍历结果:E,A,C,B,D,G,F
forInBiTree.pre_order(root)
# 中序遍历结果:A,B,C,D,E,G,F
forInBiTree.cen_order(root)
# 后序遍历结果:B,D,C,A,F,G,E
forInBiTree.later_order(root)
# 层次遍历结果:E,A,G,C,F,B,D
forInBiTree.level_order(root)

 

 

    

 

标签:遍历,self,节点,二叉树,root,order
From: https://www.cnblogs.com/chf333/p/17040934.html

相关文章

  • 代码随想录day14 LeetCode 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中
    144.二叉树的前序遍历classSolution{public:vector<int>v;vector<int>preorderTraversal(TreeNode*root){if(root==NULL)returnv;......
  • 力扣102 二叉树的层序遍历(广度优先搜索)
    题目:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]思......
  • 力扣226 翻转二叉树
    题目:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1] ......
  • 判断是不是平衡二叉树
    题目描述输入一棵节点数为n二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(BalancedBinaryTree),具有以......
  • 判断是不是完全二叉树
    题目要求给定一个二叉树,确定他是否是一个完全二叉树。完全二叉树的定义:若二叉树的深度为h,除第h层外,其它各层的结点数都达到最大个数,第h层所有的叶子结点都连续集中......
  • 二叉树由前序遍历和中序遍历求后序遍历
    题目:二叉树遍历问题描述给定一棵二叉树的先序遍历和中序遍历序列,求其后序遍历序列。输入格式输入数据有两行,为两个字符串,其长度n均小于等于26。第一行为先序遍历序......
  • 二叉树递归模板总结
    101.对称二叉树boolisQ(TreeNode*root1,TreeNode*root2){if(root1==nullptr&&root2==nullptr){returntrue;}elseif(roo......
  • leetcode-671. 二叉树中第二小的节点
    dfs取左右子树第二大的值进行比较/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNod......
  • 101. 对称二叉树
    101.对称二叉树难度简单2227收藏分享切换为英文接收动态反馈给你一个二叉树的根节点root,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:......
  • LeetCode 236_二叉树的最近公共祖先
    LeetCode236:二叉树的最近公共祖先题目给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近......