二叉树(python实现)

本文深入探讨了二叉树的基本概念,包括满二叉树和完全二叉树的定义,以及如何通过先根序、中根序和后根序遍历来访问树中的节点。同时,介绍了使用递归和非递归方法实现遍历,以及统计节点数量和求节点数值总和的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树是一种简单的树形结构,其每个节点的分支节点数有0,1或2个。如下图T1,T2和T3是三棵二叉树。显然二叉树是一种递归的结构。

 不包含任何节点的二叉树为空树,只有一个节点的二叉树称为单点树,一个节点的子节点的个数称为该节点的。如果每个分支节点的度都为2,则称之为满二叉树。T4,T5就是两棵满二叉树。

如果一棵二叉树,除最后一层外,其它层的节点都是满的,而最后一层节点在最左边连续排列,空位都在右边,这样的二叉树叫做完全二叉树,如T6、T7所示。

以下代码定义了一个二叉树类

 

想要遍历一棵二叉树,有两种不同的策略:深度优先遍历和宽度优先遍历。

其中深度优先遍历策略有三种不同的方式:

先根序遍历:按根节点、左子树、右子树的顺序遍历。

中根序遍历:按左子树、根节点、右子树的顺序遍历。

后根序遍历:按左子树、右子树、根节点的顺序遍历。

#二叉树节点类
class BinTNode:
    def __init__(self,dat,left=None,right=None):
        self.data=dat
        self.left=left
        self.right=right

class BinTree:
    def __init__(self):
        self._root=None

    def is_empty(self):
        return self._root is None

    def root(self):
        return self._root

    def leftchild(self):
        return self._root.left

    def rightchild(self):
        return self._root.right

    def set_root(self,rootnode):
        self._root=rootnode

    def set_left(self,leftchild):
        self._root.left=leftchild

    def set_right(self,rightchild):
        self._root.right=rightchild

    def preorder_elements(self):
        t=self._root
        s = SStack()
        while t is not None or not s.is_empty():
            while t is not None:
                yield t.data
                s.push(t.right)
                t = t.left
            t = s.pop()


 

其中 preorder_elements()函数可遍历输出二叉树中的节点,实现了先根序遍历的方法。

显然二叉树是是个递归结构,它的子树仍然可看做一个二叉树,因此二叉树许多方法都可以用递归方式实现。如下代码所示:

#二叉树节点类
class BinTNode:
    def __init__(self,dat,left=None,right=None):
        self.data=dat
        self.left=left
        self.right=right

#统计树中节点的个数
def count_BinTNode(t):
    if t is None:
        return 0
    else:
        return 1+count_BinTNode(t.left)+count_BinTNode(t.right)

#求二叉树里的所有数值之和
def sum_BinTNode(t):
    if t is None:
        return 0
    else:
        return t.dat+sum_BinTNode(t.left)+sum_BinTNode(t.right)

#递归方式的深度遍历二叉树(先根序),proc是具体的节点数据操作
def preorder(t,proc):
    if t is None:
        return
    proc(t.data)
    preorder(t.left,proc)
    preorder(t.right,proc)

 此外可以借助于队列实现二叉树的宽度优先遍历

#宽度优先遍历,proc是具体的节点数据操作
def levelorder(t,proc):
    qu=SQueue()
    qu.enqueue(t)
    while not qu.is_empty():
        n=qu.dequeue()
        if n is None:
            continue
        qu.enqueue(n.left)
        qu.enqueue(n.right)
        proc(n.data)

 

以下是一个简单的二叉树 Python 实现: ```python class Node: def __init__(self, value=None): self.value = value self.left_child = None self.right_child = None class BinaryTree: def __init__(self, root=None): self.root = Node(root) def insert(self, value): if self.root.value is None: self.root.value = value else: self._insert(self.root, value) def _insert(self, current_node, value): if value < current_node.value: if current_node.left_child is None: current_node.left_child = Node(value) else: self._insert(current_node.left_child, value) elif value > current_node.value: if current_node.right_child is None: current_node.right_child = Node(value) else: self._insert(current_node.right_child, value) else: print("Value already exists in the tree.") def search(self, value): return self._search(self.root, value) def _search(self, current_node, value): if current_node is None: return False elif current_node.value == value: return True elif value < current_node.value: return self._search(current_node.left_child, value) else: return self._search(current_node.right_child, value) ``` 在这个实现中,我们有两个类:一个节点类和一个二叉树类。每个节点都有一个值、左子节点和右子节点二叉树类有一个根节点,如果没有指定根节点,则默认为空。我们还定义了一个 insert() 函数来插入新值,和一个 search() 函数来查找一个值。这个实现是一个二叉查找树,可以自动按照节点值的大小来排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值