package main

import (
"fmt"
"reflect"
) type BinaryNode struct {
Data interface{} //数据
lChild *BinaryNode //左子树
rChild *BinaryNode //右子树
} //创建二叉树
func (node *BinaryNode) Create() {
node = new(BinaryNode)
} //先序遍历
func (node *BinaryNode) PreOrder() {
if node == nil {
return
}
//DLR — 先序遍历,即先根再左再右
fmt.Println(node.Data) //递归遍历左子树
node.lChild.PreOrder()
//递归遍历右子树
node.rChild.PreOrder() } //中序遍历
func (node *BinaryNode) MidOrder() {
if node == nil {
return
} //LDR — 中序遍历,即先左再根再右
//递归遍历左子树
node.lChild.MidOrder()
//打印数据
fmt.Println(node.Data)
//递归遍历右子树
node.rChild.MidOrder() } //后序遍历
func (node *BinaryNode) RearOrder() {
if node == nil {
return
} //LRD — 后序遍历,即先左再右再根
//递归遍历左子树
node.lChild.RearOrder()
//递归遍历右子树
node.rChild.RearOrder()
//打印数据
fmt.Println(node.Data)
} //二叉树高度 深度
func (node *BinaryNode) TreeHeight() int {
if node == nil {
return 0
}
//进入下一层遍历
lh := node.lChild.TreeHeight()
rh := node.rChild.TreeHeight()
if lh > rh {
lh++
return lh
} else {
rh++
return rh
} } //二叉树叶子节点个数
//叶子节点是没有后继的节点
func (node *BinaryNode) LeafCount(num *int) {
if node == nil {
return
}
//判断没有后继的节点为叶子节点
if node.lChild == nil && node.rChild == nil {
(*num)++
}
node.lChild.LeafCount(num)
node.rChild.LeafCount(num)
} //二叉树数据查找
func (node *BinaryNode) Search(Data interface{}) {
if node == nil {
return
} //== 不支持slice 和 map
//reflect.DeepEqual()
if reflect.TypeOf(node.Data) == reflect.TypeOf(Data) && node.Data == Data {
fmt.Println("找到数据", node.Data)
return
}
node.lChild.Search(Data)
node.rChild.Search(Data)
} //二叉树销毁
func (node *BinaryNode) Destroy() {
if node == nil {
return
} node.lChild.Destroy()
node.lChild = nil
node.rChild.Destroy()
node.rChild = nil
node.Data = nil } //二叉树反转
//如果想反转二叉树 二叉树必须是一个满二叉树
func (node *BinaryNode) Reverse() {
if node == nil {
return
} //交换节点 多重赋值
node.lChild, node.rChild = node.rChild, node.lChild node.lChild.Reverse()
node.rChild.Reverse() } //二叉树拷贝
func (node *BinaryNode) Copy() *BinaryNode {
if node == nil {
return nil
}
lChild:=node.lChild.Copy()
rChild:=node.rChild.Copy() //创建写节点 拷贝数据
newNode:=new(BinaryNode)
newNode.Data=node.Data
newNode.lChild=lChild
newNode.rChild=rChild
return newNode
}

go语言 二叉树的更多相关文章

  1. Hello world!(内含自己编写的C语言二叉树同学录)

      修改:刷了一段时间的题,水平渐涨,发现同学录真的要做成市面可行的应用的话,应该按学号建立二叉平衡树,红黑树是一个可行的选择. 在同学的推荐下,来到博客园来找志同道合的人交流代码.3个月后参加蓝桥杯 ...

  2. c语言二叉树基本操作

    编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...

  3. C语言二叉树的建立与遍历

    二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...

  4. [数据结构]C语言二叉树的实现

    树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面 首先我们要把树进行分类: &g ...

  5. Go语言二叉树定义及遍历算法实现

    // binary_tree 二叉树 package Algorithm import ( "reflect" ) // 二叉树定义 type BinaryTree struct ...

  6. C语言二叉树的创建、(先中后序)遍历以及存在的问题

    #include<stdlib.h> #include<stdio.h> #define True 1 #define False 0 typedef char TElemTy ...

  7. C语言二叉树遍历及路径查找

    #include<iostream> #include<stdio.h> #include<math.h> #include<malloc.h> usi ...

  8. c语言二叉树

    Department of Computing and Information SystemsCOMP10002 Foundations of AlgorithmsSemester 2, 2014As ...

  9. c语言二叉树的递归建立

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h&g ...

随机推荐

  1. Docker最全教程——从理论到实战(二十二)

    前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...

  2. Linux下用Bash语言实现输出水仙花数的功能

    题目链接: 题目描述 打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身. 例如:153是一个水仙花数,因为153=1^3+5^ ...

  3. 简单理解Linux系统的挂载是什么鬼

    转载自http://c.biancheng.net/view/2859.html Linux系统中“一切皆文件”,所有文件都放置在以根目录为树根的树形目录结构中.在 Linux 看来,任何硬件设备也都 ...

  4. 常用的H5代码

    1.返回上一页第一次在手机端用到返回上一页的时候,只写了window.history.go(-1):这一句.但是只在安卓手机有效果,兼容苹果手机需要在跳转代码后加上return false:这句.跳转 ...

  5. ES源码阅读过程

    HTTP请求的controller:RestController 游标的作用 相当于建立了一个 limit的priorityqueue 不用游标的话,相当于建立一个limit+offset的prior ...

  6. jQuery里ready方法用原生js实现原理

    function ready(fn){ if(document.addEventListener){ //标准浏览器 document.addEventListener('DOMContentLoad ...

  7. django实现简易登录注册

    经过一些文档的理解,以及一些时间的琢磨.我觉得可以用django做一些小项目了 先说说登录功能吧. 先创建一个app,用admin命令 在cmd打开到manage.py同级目录下,django-adm ...

  8. AE 打开Shp文件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. 共享v2射线局域网http代理方法

    问题描述 默认v节点大部分是socks代理,实际使用过程中存在以下问题: 部分浏览器无法支持socks需要走http代理. 局域网内其他设备(手机.PS4等)需要配置代理. 解决方法 1.在PC托盘图 ...

  10. Linux下Libevent安装和简单实用

    前言 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相 ...