最近开始找golang 开发工程师职位,针对算法相关二叉树相关常用面试题搞一遍:

package tree
import (
    "math"
    "fmt"
)
type BinaryTree struct {
    Value int
    Left  *BinaryTree
    Right *BinaryTree
}
func InitBinaryTree(root *BinaryTree) *BinaryTree {
    l := BinaryTree{}
    r := BinaryTree{}
    root.Left = l.NewBinaryTreeNode(2)
    root.Right = r.NewBinaryTreeNode(3)
    l2:=BinaryTree{}
    ll2:=BinaryTree{}
    root.Left.Left = l2.NewBinaryTreeNode(4)
    root.Left.Right = ll2.NewBinaryTreeNode(5)
    return root
}
func (this *BinaryTree) NewBinaryTreeNode(value int) *BinaryTree {
    this.Value = value
    this.Left = nil
    this.Right = nil
    return this
}
// 计算二叉树节点个数
func GetNodeNum(root *BinaryTree) int {
    if root == nil {
        return 0
    } else {
        return GetNodeNum(root.Left) + GetNodeNum(root.Right) + 1
    }
}
// 计算二叉树的深度
func GetDegree(root *BinaryTree) int {
    if root == nil {
        return 0
    }
    var maxDegree = 0
    if GetDegree(root.Left) > GetDegree(root.Right) {
        maxDegree = GetDegree(root.Left)
    } else {
        maxDegree = GetDegree(root.Right)
    }
    return maxDegree + 1
}
// 前序遍历: 根-> 左子树 -> 右子树
func PreOrder(root *BinaryTree) {
    if root == nil {
        return
    }
    fmt.Printf("%d->", root.Value)
    PreOrder(root.Left)
    PreOrder(root.Right)
}
// 中序: 左子树-> 根 -> 右子树
func InOrder(root *BinaryTree) {
    if root == nil {
        return
    }
    InOrder(root.Left)
    fmt.Printf("%d->", root.Value)
    InOrder(root.Right)
}
// 后序: 左子树-> 右子树 ->  根
func PostOrder(root *BinaryTree) {
    if root == nil {
        return
    }
    PostOrder(root.Left)
    PostOrder(root.Right)
    fmt.Printf("%d->", root.Value)
}
//  求 K 层节点个数
func GetKthNum(root *BinaryTree ,k int ) int {
    if root==nil{
        return 0 
    }
    if k==1{
        return 1 
    }
    return GetKthNum(root.Left,k-1)+GetKthNum(root.Right,k-1)
}
// 求叶子节点个数
func GetLeavNum(root *BinaryTree) int {
    if root==nil{
        return 0
    }
    if root.Left==nil && root.Right == nil {
        return 1
    }
    return GetLeavNum(root.Left)+GetLeavNum(root.Right)
}
// 判断是否平衡二叉树
func IsBalanced(root *BinaryTree) bool {
    if root==nil{
        return  true
    }
    lde:=GetDegree(root.Left)
    rde:=GetDegree(root.Right)
    flag:=false
    if (math.Abs(float64(lde-rde)))<=1{
        flag=true
    }else{
        flag=false
    }
    return flag && IsBalanced(root.Left) && IsBalanced(root.Right)
}

golang编写二叉树的更多相关文章

  1. Golang编写动态库实现回调函数

    Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...

  2. 使用golang 编写postgresql 扩展

      postgresql 的扩展可以帮助我们做好多强大的事情,支持的开发语言有lua.perl.java.js.c 社区有人开发了一个可以基于golang开发pg 扩展的项目,使用起来很方便,同时为我 ...

  3. 使用 Golang 编写链代码 (v0.6 )

    https://www.ibm.com/developerworks/cn/cloud/library/cl-ibm-blockchain-chaincode-testing-using-golang ...

  4. Golang 编写 Tcp 服务器

    Golang 作为广泛用于服务端和云计算领域的编程语言,tcp socket 是其中至关重要的功能.无论是 WEB 服务器还是各类中间件都离不开 tcp socket 的支持. Echo 服务器 拆包 ...

  5. Golang编写Windows动态链接库(DLL)及C调用范例

    一.准备. 1.GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本. 2.你的电脑上需要gcc,如果没有的话[点击这里] ...

  6. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  7. java编写二叉树以及前序遍历、中序遍历和后序遍历 .

    /** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...

  8. 使用Golang编写优化算法 (1)

    动手写点东西是学习新知识很重要的一个阶段.之前用 Python 和 JavaScript 实现优化算法,现在用 Golang 来实现.语法上略有不爽,某些C语言的思维又回来了. - Golang 用 ...

  9. 使用golang编写prometheus metrics exporter

    metrcis输出 collector.go package main import ( "github.com/prometheus/client_golang/prometheus&qu ...

随机推荐

  1. LC 980. Unique Paths III

    On a 2-dimensional grid, there are 4 types of squares: 1 represents the starting square.  There is e ...

  2. 怎么去检测浏览器支不支持html5和css3?

    HTML5, CSS3 以及其他相关技术例如 Canvas.WebSocket 等等将 Web 应用开发带到了一个新的高度. 该技术通过组合 HTML.CSS 和 JavaScript 可以开发出桌面 ...

  3. 关于Content-Type中application/x-www-form-urlencoded 和 multipart/form-data的区别及用法

    http://blog.csdn.net/soonfly/article/details/52082547 Form的enctype属性表示页面表单数据向服务器传输时的编码方式, 常用有两种:appl ...

  4. 【笔记】7天玩转容器&CKA管理员实训

    第一部分 day1,容器基础知识介绍 安装 apt-get install docker-engine [root@cce-7day-fudonghai-24106 01CNL]# docker -v ...

  5. Qt 字符映射表 显示图标

    一.利用字符映射表segmdl2.ttf,窗体显示字符图片. 在win10里面搜“字符映射表”,选择字体segmdl2.ttf,查看图标对应得16进制值.把此字体拷贝到程序的目录下. 二.使用 #if ...

  6. vue中如何编写可复用的组件?

    原文地址 Vue.js 是一套构建用户界面的渐进式框架.我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件. 从维护视图到维护数据,Vue.js 让我们快速地开发应用.但随着业务代码日 ...

  7. 学校或公司转ISP -boardband (上网公司)注意事项记录

    如果学校或公司轉boardband , 1. 要更新 domain IP (亦可以轉移domain 去新ISP公司, 要HKDNR 登入名稱和密碼,可問舊ISP即boardband 公司或域名管理方要 ...

  8. 解读GitHub EntityComponentSystemSamples

    出自Unity官方的ECS项目示例,该项目的第一次Commit是在2018年3月20号,距离现在一年半的时间,这期间ECS本身的生态在快速发展,稳定性也是逐步提升,期待在2020年的Unity版本中作 ...

  9. Jenkins学习指南

    jenkinshttps://www.cnblogs.com/jimmy-xuli/p/9020825.htmlhttps://www.cnblogs.com/along21/p/10172855.h ...

  10. java23种设计模式之四:建造者模式

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...