美文网首页
golang满二叉树及遍历

golang满二叉树及遍历

作者: 宋song一 | 来源:发表于2020-12-13 11:33 被阅读0次
// 判断一棵二叉树是不是满二叉树(树的节点层数h不超过16层)
type Node struct {
    val   int
    left  *Node
    right *Node
}
//二叉树深度
func maxDepth(root *Node) int {
    if root == nil {
        return 0
    }
    lhight := maxDepth(root.left)
    rhight := maxDepth(root.right)
    return max(lhight, rhight)
}
func max(a, b int) int {
    if a > b {
        return a + 1
    }
    return b + 1
}
//判断
func isFull(root *Node) bool {
    if root == nil {
        return true
    }
    lheight := maxDepth(root.left)
    rheight := maxDepth(root.right)
    fmt.Println("l:", lheight, "r:", rheight)
    return isFull(root.left) && isFull(root.right) && (lheight == rheight)

    //完全二叉树
    //if math.Abs(float64(Height(root.left)-Height(root.right))) ==1  {
    //  flag = true
    //} else {
    //  flag = false
    //}
    //return flag && isFull(root.left) && isFull(root.right)
}
func main() {
    root := &Node{1, nil, nil}
    n1 := &Node{2, nil, nil}
    n2 := &Node{3, nil, nil}
    n3 := &Node{4, nil, nil}
    n4 := &Node{5, nil, nil}
    //n5 := &Node{6, nil, nil}
    //n6 := &Node{7, nil, nil}

    root.left = n1
    root.right = n2
    n1.left = n3
    n1.right = n4
    //n2.left = n5
    //n2.right = n6
    fmt.Println("前------------")
    PreOrderTraversal(root)
    fmt.Println()
    fmt.Println("中------------")
    MidOrderTraversal(root)
    fmt.Println()
    fmt.Println("后------------")
    PostOrderTraversal(root)
    fmt.Println()
    fmt.Println("层------------")
    LevelOrderTraversal(root)
    fmt.Println("------------")
    fmt.Println(isFull(root))
}
//2.最小深度
//func minDepth(root *Node) int{
//  if root==nil{
//      return 0
//  }
//  lhight := minDepth(root.left)
//  rhight := minDepth(root.right)
//  if root.left==nil{
//      return lhight+1
//  }else if root.right==nil{
//      return rhight+1
//  }else {
//      return min(lhight,rhight)+1
//  }
//}
//func min(a,b int) int {
//  if a<b{
//      return a
//  }
//  return b
//}
// 中序遍历 左 -> 中 -> 右。
func MidOrderTraversal(tree *Node) {
    if tree == nil {
        return
    }

    MidOrderTraversal(tree.left)
    fmt.Printf(" %d -> ", tree.val)
    MidOrderTraversal(tree.right)
}

// 后序遍历   左 -> 右 -> 中。
func PostOrderTraversal(tree *Node) {
    if tree == nil {
        return
    }

    PostOrderTraversal(tree.left)
    PostOrderTraversal(tree.right)
    fmt.Printf(" %d -> ", tree.val)
}

// 前序遍历 遍历顺序
//  中 -> 左 -> 右。
func PreOrderTraversal(tree *Node) {
    if tree == nil {
        return
    }
    fmt.Printf(" %d -> ", tree.val)
    PreOrderTraversal(tree.left)
    PreOrderTraversal(tree.right)
}

// 按层遍历
func LevelOrderTraversal(tree *Node) {
    if tree == nil {
        return
    }

    // 采用队列实现
    queue := make([]*Node, 0)
    queue = append(queue, tree) // queue push
    for len(queue) > 0 {
        tree = queue[0]
        fmt.Printf(" %d -> ", tree.val)

        queue = queue[1:] // queue pop

        if tree.left != nil {
            queue = append(queue, tree.left)
        }
        if tree.right != nil {
            queue = append(queue, tree.right)
        }
    }
}

相关文章

  • golang满二叉树及遍历

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 数据结构基础学习之(树与二叉树)

    主要知识点: 树的定义及常用术语 树的存储表示 二叉树、满二叉树和完成二叉树的定义 二叉树的遍历此操作实现 哈夫曼...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树遍历方式总结(递归&迭代)

    经过一周的学习,我了解到了二叉树的遍历是非常重要且容易出错的,所以对二叉树的遍历方式及实现方式做个总结 一. 遍历...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

网友评论

      本文标题:golang满二叉树及遍历

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