美文网首页
利用链表实现二叉树

利用链表实现二叉树

作者: 梁森的简书 | 来源:发表于2021-02-21 00:10 被阅读0次

节点

成员变量:左子树、右子树、key、value

二叉树

成员变量:根节点、节点数量
方法:插入、删除、获取某个节点
插入实现

如果插入节点的key比当前节点的key大就递归插入其右子树,如果小就递归插入其左子树,如果相等就直接更改其value

获取某个节点实现

如果获取节点的key比当前节点的key大就递归从其右子树查找,如果小就递归从其左子树查找,如果相等就直接获取其value

删除实现

如果删除节点的key比当前节点的key大就递归删除其右子树,如果小就递归删除其左子树,如果相等再看当前节点的左右子树,如果右子树为空直接返回其左子树,如果左子树为空直接返回其右子树,如果都不为空就获取右子树中最小的节点并将其返回,同时需要删除这个节点

代码:

// 节点
class TreeNode {
    var left: TreeNode?
    var right: TreeNode?
    var key: String!
    var value: String!
    init(key: String, value: String, left: TreeNode?, right: TreeNode?) {
        self.left = left
        self.right = right
        self.key = key
        self.value = value
    }
}

// 二叉树
class BinaryTree {
    var root: TreeNode?
    var N = 0
    
    func size() -> Int {
        return N
    }
    
    // 插入
    func put(key: String, value: String) {
        root = put(node: root, key: key, value: value)
    }
    func put(node: TreeNode?, key: String, value: String) -> TreeNode? {
        if node == nil {
            N += 1
            return TreeNode(key: key, value: value, left: nil, right: nil)
        }
        let result = key.compare(node!.key)
        if result == .orderedDescending {   // key大往右子树插
            node!.right = put(node: node!.right, key: key, value: value)
        } else if result == .orderedAscending { // key小往左子树插
            node!.left = put(node: node!.left, key: key, value: value)
        } else {    // key相等直接替换
            node!.value = value
        }
        return node
    }
    
    // 获取
    func get(key: String) -> String? {
        return get(node: root, key: key)
    }
    func get(node: TreeNode?, key: String) -> String? {
        if node == nil {
            return nil
        }
        let result = key.compare(node!.key)
        if result == .orderedDescending {   // key大就从右子树找
            return get(node: node?.right, key: key)
        } else if result == .orderedAscending { // key小就从左子树找
            return get(node: node?.left, key: key)
        } else {    // key相等直接替换
            return node?.value
        }
    }
    
    // 删除
    func delete(key: String) -> TreeNode? {
        return delete(node: &root, key: key)
    }
    func delete(node: inout TreeNode?, key: String) -> TreeNode? {
        if node == nil {
            return nil
        }
        let result = key.compare(node!.key)
        if result == .orderedDescending {   // key大就从右子树找
            return delete(node: &node!.right, key: key)
        } else if result == .orderedAscending { // key小就从左子树找
            return delete(node: &node!.left, key: key)
        } else {    // key相等直接删除
            N -= 1
            if node?.right == nil {
                return node?.left
            }
            if node?.left == nil {
                return node?.right
            }
            var miniNode = node?.right  // 获取右子树中最小的
            while miniNode?.left != nil {
                miniNode = miniNode?.left
            }
            // 删除右子树中最小的
            var n = node?.right
            while n?.left != nil {
                if n?.left?.left == nil {
                    n?.left = nil
                } else {
                    n = n?.left
                }
            }
            miniNode?.left = node?.left
            miniNode?.right = node?.right
            node = miniNode
        }
        return node
    }
}

demo地址:https://github.com/yangguanghei/studyDateStructure

相关文章

  • 大体整理

    链表 给定两个链表和第三个链表,找规律然后进行算法实现。 二叉树 非递归实现二叉树中序遍历 数组 寻找两个排序数组...

  • 利用链表实现二叉树

    节点 成员变量:左子树、右子树、key、value 二叉树 成员变量:根节点、节点数量方法:插入、删除、获取某个节...

  • 树 - 实现二叉排序树(Java)

    链表实现二叉树的类型声明(Java): 二叉树的构建 调用(Kotlin写法): 二叉树构建过程分解:

  • 2020-10-28

    快排 链表反转 链表反转 二叉树非递归实现 按层排序 二叉树深度 合并有序数组 二分查找 有序数组 查找 楼梯问题

  • PHP 实现数据结构

    参考诸多视频和文章,主要通过PHP 实现线性表的顺序存储结构,单链表,静态链表,双向链表以及二叉树等数据结构,代码...

  • 二叉树的遍历

    前言 二叉树和链表在历年春招笔试中,都是重点考核对象。链表由于算法简单,一般考代码实现能力。二叉树考核遍历。 二叉...

  • 实验五——二叉树

    按照下面二叉树二叉链表的存储表示,编写头文件binary_tree.h,实现二叉链表的定义与基本操作实现函数;编写...

  • C语言结构体实现线性链表

    利用C语言的结构体和指针链表的相关知识,自己动手敲了下实现类似链表的功能。 创建方法 实现功能是接受用户输入链表长...

  • 利用链表实现栈

    入栈:插入到头节点的下一个节点。 出栈:移除头节点的下一个节点

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

网友评论

      本文标题:利用链表实现二叉树

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