go语言 二叉树
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语言 二叉树的更多相关文章
- Hello world!(内含自己编写的C语言二叉树同学录)
修改:刷了一段时间的题,水平渐涨,发现同学录真的要做成市面可行的应用的话,应该按学号建立二叉平衡树,红黑树是一个可行的选择. 在同学的推荐下,来到博客园来找志同道合的人交流代码.3个月后参加蓝桥杯 ...
- c语言二叉树基本操作
编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...
- C语言二叉树的建立与遍历
二叉树的建立和遍历都要用到递归,先暂时保存一下代码,其中主要是理解递归的思想,其它的就都好理解了.这里是三种遍历方式,其实理解一种,其它的几个就都理解了,就是打印出来的顺序不一样而已.建立和遍历的方式 ...
- [数据结构]C语言二叉树的实现
树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面 首先我们要把树进行分类: &g ...
- Go语言二叉树定义及遍历算法实现
// binary_tree 二叉树 package Algorithm import ( "reflect" ) // 二叉树定义 type BinaryTree struct ...
- C语言二叉树的创建、(先中后序)遍历以及存在的问题
#include<stdlib.h> #include<stdio.h> #define True 1 #define False 0 typedef char TElemTy ...
- C语言二叉树遍历及路径查找
#include<iostream> #include<stdio.h> #include<math.h> #include<malloc.h> usi ...
- c语言二叉树
Department of Computing and Information SystemsCOMP10002 Foundations of AlgorithmsSemester 2, 2014As ...
- c语言二叉树的递归建立
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h&g ...
随机推荐
- Git和TortoiseGit
1.简介 Git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目.它采用了分布式版本库的方式,不必服务器端软件支持. 2.Git和Svn的区别 1.Git 是分布式的,SVN 不是 ...
- Spark Streaming数据限流简述
Spark Streaming对实时数据流进行分析处理,源源不断的从数据源接收数据切割成一个个时间间隔进行处理: 流处理与批处理有明显区别,批处理中的数据有明显的边界.数据规模已知:而流处理数 ...
- tomcat-embeded-core源码编译
使用spring-boot创建web工程时,默认采用embeded tomcat作为容器,实际使用过程中,可能会需要对其中的某些功能做微调,而tomcat又没有给出预留配 ,这时就需要对tomcat- ...
- python 3 可迭代对象与迭代器
1,可迭代对象 内部含有__iter__方法的对象是可迭代对象 遵循可迭代协议 dir() 检查对象含有什么方法 dir()会返回一个列表,这个列表中含有该对象的以字符串的形式所有方法名.这样我们就可 ...
- MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据)
MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在MATLAB中“fitgmdis ...
- weblogic的ssrf漏洞
前言 什么是ssrf SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞. 一般情况下,SSRF攻击的目标 ...
- LaTeX技巧008:如何给文字添加阴影效果?
大家可以使用这个包:shadowtext宏包
- 【C语言】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,a说他不和x比,c说他不和x,z比,编写程序找出三对赛手名单。
问题分析:假设a是A的对手,b是B的对手,c是C的对手,a,b,c分别是x,y,z之一,且a,b,c互不相等,同时还要满足条件a!= 'x'&&c != 'x'&&c ...
- BZOJ3932 CQOI2015 任务查询系统 - 主席树,离散化
记录下自己写错的地方吧 1. 区间可能有重复 2. 没有出现的坐标也要计入version (因为询问里可能会有) #include <bits/stdc++.h> using namesp ...
- Codeforces 383C Propagating tree, 线段树, 黑白染色思想
按深度染色,奇深度的点存反权值. #include <bits/stdc++.h> using namespace std; vector <]; ],a[],s[],vis[],i ...