美文网首页
算法 -- 二叉树

算法 -- 二叉树

作者: liaozb1996 | 来源:发表于2018-03-16 00:06 被阅读0次
二叉树

节点

Node

节点包括:

  • key
  • value
  • left : 指向左子节点
  • right:指向右子节点
  • size:子节点的数量 + 1 (自己)

size

size 的值是要包括自身在内的,想象只有一个节点时,size 的大小是 1


只有一个节点

代码

#!/usr/bin/python3

class BinarySearchTree:
    class Node:
        def __init__(self, key, value, size):
            self.key = key
            self.value = value
            self.size = size
            self.left = None
            self.right = None

    def __init__(self):
        self.root = None

    def get_size(self): # 供外部调用
        return get_size_inside(self.root)

    def get_size_inside(self, node):
        if node == None:
            return 0
        else:
            return node.size

    def get(self, key): # 因为 python 不支持重载,所以在外部调用该方法;该方法调用真正进行递归查找的 get_recursion()
        return self.get_recursion(self.root, key)

    def get_recursion(self, node, key):
        if node == None:
            return None, 0
        elif key == node.key:
            return node.value, node.size
        elif key < node.key:
            return self.get_recursion(node.left, key)
        elif key > node.key:
            return self.get_recursion(node.right, key)

    def put(self, key, value):
        self.root = self.put_recursion(self.root, key, value)

    def put_recursion(self, node, key, value):
        '''递归到一个空位,插入新节点;沿路返回修改各节点的 size 值(+1)'''
        if node == None:
            return self.Node(key, value, 1)
        elif key == node.key:
            node.value = value  # 替换值而已,不应把size + 1 ;所以要用下面 (# 更新 size) 的方法;而不是沿路返回都 +1
        elif key < node.key:
            node.left = self.put_recursion(node.left, key, value)
        elif key > node.key:
            node.right = self.put_recursion(node.right, key, value)

        node.size = self.get_size_inside(node.left) + self.get_size_inside(node.right) + 1 # 更新 size

        return node


if __name__ == '__main__':

    bst = BinarySearchTree()

    # 读取输入
    while True:
        key = input('key: ').strip()
        if key == '':
            break
        value = input('value: ').strip()
        bst.put(key, value)

    print('-' * 30)

    # 从链表中获取值
    while True:
        key = input('key: ').strip()
        if key == '':
            break
        print('value: {}, size: {}'.format(*bst.get(key)))

github 完整代码 -- binarySearchTree.py

相关文章

  • 每日Leetcode—算法(10)

    100.相同的树 算法: 101.对称二叉树 算法: 104.二叉树的最大深度 算法: 107.二叉树的层次遍历 ...

  • 每日Leetcode—算法(11)

    110.平衡二叉树 算法: 111.二叉树的最小树深 算法: 112.路径总和 算法:

  • Algorithm小白入门 -- 二叉树

    二叉树二叉树构造二叉树寻找重复子树 1. 二叉树 基本二叉树节点如下: 很多经典算法,比如回溯、动态规划、分治算法...

  • 二叉树的基本算法

    二叉树的基本算法 树、二叉树 的基本概念,参考数据结构算法之美-23讲二叉树基础(上):树、二叉树[https:/...

  • 二叉树的中序遍历(Java)——Morris迭代算法

    二叉树的中序遍历 对于此题而言,若采用递归算法(简单),我们使用深度优先算法来遍历二叉树。若采用迭代算法,我们使用...

  • 2019-10-22

    最优二叉树搜索算法。

  • 翻转二叉树(Java)

    翻转二叉树 对于此题而言,我们使用深度优先算法来遍历二叉树。 1、深度优先算法是根据二叉树的路径进行遍历2、广度优...

  • 二叉树遍历(递归算法和非递归算法)

    实验三 二叉树遍历(递归算法和非递归算法) 一.实验目的 1.掌握二叉树的存储结构与基本操作 2.掌握二叉树的遍历...

  • LeetCode基础算法-树

    LeetCode基础算法-树 LeetCode 树 基础算法 1. 二叉树的最大深度 给定一个二叉树,找出其最大深...

  • 【算法题】递归求二叉树深度

    二叉树的深度算法,是二叉树中比较基础的算法了。对应 LeetCode 第104题。 然后你会发现 LeetCode...

网友评论

      本文标题:算法 -- 二叉树

      本文链接:https://www.haomeiwen.com/subject/koykqftx.html