golang编写二叉树

Posted shaoyu19900421

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang编写二叉树相关的知识,希望对你有一定的参考价值。

最近开始找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编写二叉树的主要内容,如果未能解决你的问题,请参考以下文章

树二叉树满二叉树完全二叉树遍历二叉树java实现

二叉树及特殊二叉树(满二叉树完全二叉树二叉排序树平衡二叉树)的定义和性质(附详细推理过程)

二叉树二叉树的镜像

普通二叉树二叉查找树平衡二叉树常见操作汇总

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

树二叉树满二叉树完全二叉树