Python之二叉树

简介: 笔记

二叉树(BTree


20.png

话说python的BTree插入节点,用队列bfs插入,效率贼低吧

class Node:
    """节点类"""
    def __init__(self, data = -1, left = None, right = None):
        self.data = data
        self.left = left
        self.right = right
class BTree:
    """树类"""
    def __init__(self, root = None):
        self.root = root
    def insert(self, data):
        node = Node(data)
        if self.root is None:
            self.root = node
            return 
        queue = [self.root]
        while queue:
            cur = queue.pop(0)
            if cur.left is None:
                cur.left = node
                return 
            elif cur.right is None:
                cur.right = node
                return 
            else:
                queue.append(cur.left)
                queue.append(cur.right)
    # 先序遍历
    def preorder(self, root):
        if root is None:
            return []
        res = [root.data]
        left_res = self.preorder(root.left)
        right_res = self.preorder(root.right)
        return res + left_res + right_res
    # 中序遍历
    def inorder(self, root):
        if root is None:
            return []
        res = [root.data]
        left_res = self.inorder(root.left)
        right_res = self.inorder(root.right)
        return left_res + res + right_res
    # 后序遍历
    def postorder(self, root):
        if root is None:
            return []
        res = [root.data]
        left_res = self.postorder(root.left)
        right_res = self.postorder(root.right)
        return left_res + right_res + res
    # 层序遍历
    def traverse(self):
        if self.root is None:
            return None
        queue = [self.root]
        res = [self.root.data]
        while queue != []:
            cur = queue.pop(0)
            if cur.left is not None:
                queue.append(cur.left)
                res.append(cur.left.data)
            if cur.right is not None:
                queue.append(cur.right)
                res.append(cur.right.data)
        return res
    # 获取树高
    def height(self, root):
        if root is None:
            return 0
        return 1 + max(self.height(root.left), self.height(root.right))
    # 所有叶子节点
    def leaves(self, root):
        if root is None:
            return []
        if root.left is None and root.right is None:
            return [root.data]
        return self.leaves(root.left) + self.leaves(root.right)

二叉搜索树(BSTree)


主要是对节点的封装


21.png

class Node:
    """节点类"""
    def __init__(self, data = -1, left = None, right = None, father = None):
        self.data = data
        self.left = left
        self.right = right
        self.father = father
    def __str__(self):
        return str(self.data)
    @staticmethod
    def find(root, data):
        if root == None:
            return None
        if root.data == data:
            return root
        if root.data < data:
            return Node.find(root.right, data)
        return Node.find(root.left, data)
    @staticmethod
    def insert(root, data):
        if root == None:
            return Node(data)
        if root.data == data:
            return root
        if root.data < data:
            root.right = Node.insert(root.right, data)
        else:
            root.left = Node.insert(root.left, data)
        return root
    @staticmethod
    def next(root):
        if root.right != None:
            root = root.right
            while root.left != None:
                root = root.left
            return root
        while root.father != None and root != root.father.left:
            root = root.father
        return root.father
    @staticmethod
    def delete(root, data):
        if root == None:
            return None
        if root.data < data:
            root.right = Node.delete(root.right, data)
        elif root.data > data:
            root.left = Node.delete(root.left, data)
        else:
            if root.left == None or root.right == None:
                tmp = root.left if root.left != None else root.right
                del root
                return tmp
            tmp = Node.next(root)
            root.data = tmp.data
            return Node.delete(root.right, tmp.data)
        # 这里别忘记了,无语子!!!
        return root

这里封装的效果就体现出来了,多简洁的BSTree(hhh

方法同上,外加一个find_k()(之后在补优化方法,如果没改,那我就是忘了

class BSTree:
    """二叉搜索树类"""
    def __init__(self, root = None):
        root = Node()
        self.root = root
    def insert(self, data):
        self.root.left = Node.insert(self.root.left, data)
    def delete(self, data):
        # 这里也要接住,万一删的是root
        self.root.left = Node.delete(self.root.left, data)
    def find(self, data):
        return Node.find(self.root.left, data)
    # 查找第k小(1-n)
    def find_k(self, k):
        # 好像不好维护 size, insert如果是存在的,size不++,以后在优化,hhh
        res = self.inorder(self.root.left)
        if k > len(res):
            return -1
        return res[k - 1]
    def inorder(self, root):
        if root is None:
            return []
        res = [root.data]
        left_res = self.inorder(root.left)
        right_res = self.inorder(root.right)
        return left_res + res + right_res
t = BSTree()
print(t.root)
for i in range(10, 0, -1):
    t.insert(i * 3 % 7 - 10)
print(t.inorder(t.root.left))
print(t.find(15))
print(t.find_k(3))

吐槽一下:我花了不下5小时弄这个,大概就是模仿之前C++敲过的代码,写出的一个我自己理解的python版本。边角的细节还是很多的,尤其是对节点的删除操作。


代码应该是基本没问题,反正我能正常的跑出来,主要是为了复习一下二叉树的实现以及思想,我并没有去写一些概念性的东西,反正都在代码里了。


相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
62 6
|
4月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
30 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
70 7
|
4月前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
28 5
|
4月前
|
Python
【Leetcode刷题Python】236. 二叉树的最近公共祖先
LeetCode上236号问题"二叉树的最近公共祖先"的Python实现,使用递归方法找到两个指定节点的最近公共祖先。
42 5
|
4月前
|
Python
【Leetcode刷题Python】199. 二叉树的右视图
LeetCode上199号问题"二叉树的右视图"的Python实现,通过深度优先搜索算法按层序从右向左访问节点,以获取每层的最右边节点的值。
31 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
41 3
|
4月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
30 3
|
4月前
|
存储 Python
【Leetcode刷题Python】103. 二叉树的锯齿形层序遍历
LeetCode上103号问题"二叉树的锯齿形层序遍历"的Python实现,使用了双端队列来实现层与层之间交替的遍历顺序。
23 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
36 2