IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-07-22 -> 正文阅读

[数据结构与算法]2021-07-22

二叉树

用list形式表示二叉树吧btree[0]表示结点数据,btree[1]表示左子树,btree[2]表示右子树。里面就是列表套列表……这里完全没必要用类了,就用一些方法就行了,构造成一个类挺麻烦的,应该也能行。

def BinTree(data, left=None, right=None):
    return [data, left, right]


def is_empty_BinTree(btree):
    return btree is None


def root(btree):
    return btree[0]


def left(btree):
    return btree[1]


def right(btree):
    return btree[2]

def set_root(btree, data):
    btree[0] = data


def set_left(btree, data):
    btree[1] = data


def set_right(btree, right):
    btree[2] = right


if __name__ == '__main__':
    tree = BinTree(2, BinTree(4), BinTree(8))
    print(tree)
    set_left(left(tree), BinTree(5))
    print(tree)

结果:
[2, [4, None, None], [8, None, None]]
[2, [4, [5, None, None], None], [8, None, None]]

二叉树类(这个是重点)

from stack.SStack import SStack


class BinTNode(object):
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right


class BinTree(object):                        # 基于链表模式实现二叉树
    def __init__(self):
        self._root = None

    def is_empty(self):                       # 二叉树为空
        return self._root is None

    def root(self):
        return self._root

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

    def rightchind(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, s = self._root, SStack()
        while t is not None or not s.is_empty():
            while t is not None:
                s.push(t.right)
                yield t.data
                t = t.left
            t = s.pop()


def preorder(t):                                            # 根序遍历
    if t is None:
        return
    print(t.data, end=' ')
    preorder(t.left)
    preorder(t.right)


def print_BinNode(t):                                        # 输出这棵树
    if t is None:
        print("^", end='')                                   # 空树输出^
        return
    print("(" + str(t.data), end='')
    print_BinNode(t.left)
    print_BinNode(t.right)
    print(")", end='')


def count_BinTNodes(t):                                # 统计结点的个数
    if t is None:
        return 0
    else:
        return 1 + count_BinTNodes(t.left) + count_BinTNodes(t.left)


def sum_BinTNode(t):                                  # 计算结点中的所有数值
    if t is None:
        return 0
    else:
        return t.data + sum_BinTNode(t.left) + sum_BinTNode(t.right)


if __name__ == '__main__':
    tree1 = BinTree()
    tree1.set_root(BinTNode(1))

    tree2 = BinTree()
    tree2.set_root(BinTNode(2))
    tree2.set_left(BinTNode(4))
    tree2.set_right(BinTNode(5))

    tree3 = BinTree()
    tree3.set_root(BinTNode(3))
    tree3.set_left(BinTNode(6))
    tree3.set_right(BinTNode(7))

    tree1.set_left(tree2.root())
    tree1.set_right(tree3.root())

    print_BinNode(tree2.root())
    print()
    print_BinNode(tree3.root())
    print()
    print_BinNode(tree1.root())
    print()

    count = count_BinTNodes(tree1.root())
    sum = sum_BinTNode(tree1.root())

    print(count)
    print(sum)
    preorder(tree1.root())

结果:
(2(4^^)(5^^))
(3(6^^)(7^^))
(1(2(4^^)(5^^))(3(6^^)(7^^)))
7
28
1 2 4 5 3 6 7 

我是创建了tree2和tree3再把他们添加给tree1的,成为tree的左右子树。其他的懒得罗嗦了,反正没人看……这是我的简单总结。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 00:10:44  更:2021-07-24 00:11:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:51:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码