zoukankan      html  css  js  c++  java
  • golang实现二叉搜索树

    数据结构
    首先我们定义需要的数据结构。注意,TreeNode的左右节点都是TreeNode type的,而树只有一个Root数据域,为TreeNode type

    type TreeNode struct {
      Value int
      Left *TreeNode
      Right *TreeNode
    }
    
    type BinarySearchTree struct {
      Root *TreeNode
    }
    

    Insert
    向二叉搜索树中插入元素,首先要找到插入的位置,然后再插入。这里注意我们的实现方法为给TreeNode和BinarySearchTree这两个type添加方法。
    需要注意给type添加方法的方式,同时还要注意,如果你要改变方法调用者,则需要使用指针

    func (tree BinarySearchTree) Insert (v int) {
      tree.Root.Insert(v)
    }
    
    func (node *TreeNode) Insert (v int){
      if v < node.Value {
        if node.Left != nil{
          node.Left.Insert(v)
        }else{
          node.Left = &TreeNode{v, nil, nil}
        }
      }else {
        if node.Right != nil{
          node.Right.Insert(v)
        }else{
          node.Right = &TreeNode{v, nil, nil}
        }
      }
    }
    

    遍历
    树的遍历有前序,后序,中序等等。这里以中序为例。注意slice与slice指针的不同

    func (tree BinarySearchTree) InOrder() []int{
      var res []int
      tree.Root.InOrder(&res)
      return res
    }
    
    func (node *TreeNode) InOrder(result *[]int) {
      if node.Left != nil{
        node.Left.InOrder(result)
      }
      *result = append(*result, node.Value)
      if node.Right != nil{
        node.Right.InOrder(result)
      }
    }
    

    最大最小值

    func (tree BinarySearchTree) FindMin() int {
      node := tree.Root
      for {
        if node.Left != nil {
          node = node.Left
        }else{
          return node.Value
        }
      }
    }
    
    func (tree BinarySearchTree) FindMax() int {
      node := tree.Root
      for {
        if node.Right != nil {
          node = node.Right
        }else{
          return node.Value
        }
      }
    }
    

    查找

    func (tree BinarySearchTree) Contains(v int) bool {
      node := tree.Root
      for {
        if node == nil{
          return false
        }else if (node.Value == v) {
          return true
        }else if (node.Value > v){
          node = node.Left
        }else{
          node = node.Right
        }
      }
    }
    
    
  • 相关阅读:
    dom4j读写XML文件
    Spring的javaMail邮件发送(带附件)
    PayPal网站付款标准版(for PHP)
    SpringMVC整合TaskExecutor线程池的配置/使用
    SELECT INTO和INSERT INTO SELECT(SQL Server)
    java简单的数据库查询(SQLServer数据库)
    oracle导入TYPE对象报错ORA-02304
    mysql将字符串转化为数字
    asp.net应用发布到IIS无法链接到oracle数据库
    使用js获取数组中最大、最小的数字
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/11353073.html
Copyright © 2011-2022 走看看