// binary_tree 二叉树
package Algorithm import (
"reflect"
) // 二叉树定义
type BinaryTree struct {
Data interface{}
Lchild *BinaryTree
Rchild *BinaryTree
} // 构造方法
func NewBinaryTree(data interface{}) *BinaryTree {
return &BinaryTree{Data: data}
} // 先序遍历
func (bt *BinaryTree) PreOrder() []interface{} {
t := bt
stack := NewStack(reflect.TypeOf(bt))
res := make([]interface{}, )
for t != nil || !stack.Empty() {
for t != nil {
res = append(res, t.Data)
stack.Push(t)
t = t.Lchild
}
if !stack.Empty() {
v, _ := stack.Pop()
t = v.(*BinaryTree)
t = t.Rchild
}
}
return res
} // 中序遍历
func (bt *BinaryTree) InOrder() []interface{} {
t := bt
stack := NewStack(reflect.TypeOf(bt))
res := make([]interface{}, )
for t != nil || !stack.Empty() {
for t != nil {
stack.Push(t)
t = t.Lchild
}
if !stack.Empty() {
v, _ := stack.Pop()
t = v.(*BinaryTree)
res = append(res, t.Data)
t = t.Rchild
}
}
return res
} // 后续遍历
func (bt *BinaryTree) PostOrder() []interface{} {
t := bt
stack := NewStack(reflect.TypeOf(bt))
s := NewStack(reflect.TypeOf(true))
res := make([]interface{}, )
for t != nil || !stack.Empty() {
for t != nil {
stack.Push(t)
s.Push(false)
t = t.Lchild
}
for flag, _ := s.Top(); !stack.Empty() && flag.(bool); {
s.Pop()
v, _ := stack.Pop()
res = append(res, v.(*BinaryTree).Data)
flag, _ = s.Top()
}
if !stack.Empty() {
s.Pop()
s.Push(true)
v, _ := stack.Top()
t = v.(*BinaryTree)
t = t.Rchild
}
}
return res
}

github链接:https://github.com/gaopeng527/go_Algorithm/blob/master/binary_tree.go

Go语言二叉树定义及遍历算法实现的更多相关文章

  1. 二叉树 ADT接口 遍历算法 常规运算

    BTree.h   (结构定义, 基本操作, 遍历) #define MS 10 typedef struct BTreeNode{ char data; struct BTreeNode * lef ...

  2. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

  3. [LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

    描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分层遍历结果: [ [3] ...

  4. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. 1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

    阅读并理解提供给大家的C语言文法文件. 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图 ...

  7. 链表创建和链表遍历算法的演示_C语言

    今天搞了一个多小时,头是疼的,应该是没休息好吧,学习了数据结构这一节,感觉收益良多,下面贴上代码和心得: /*24_链表创建和链表遍历算法的演示*/ # include <stdio.h> ...

  8. 毕业了-java二叉树层次遍历算法

    /*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直 ...

  9. 算法 dfs —— 将二叉树 先序遍历 转为 链表

    将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...

随机推荐

  1. Mac mumu模拟器设置代理

    adb devices adb connect 127.0.0.1:5555 adb shell am start -a android.intent.action.MAIN -n com.andro ...

  2. Python 线程和进程

    一.什么是线程 1.线程是操作系统能够进行运算调度的最小单位.它被包含在进程中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 ...

  3. BZOJ3862 Little Devil I 树链剖分

    原文链接http://www.cnblogs.com/zhouzhendong/p/8081514.html 题目传送门 - BZOJ3862 题意概括 一棵树,n个点,边权为黑或者白,支持3重操作: ...

  4. bitset里面一些函数的用法

  5. day7 [id],[is],编码

    老师的笔记: 字典:dic = {'name':'alex'} 1,增 dic['k'] = 'v' 有键值对,则覆盖 setdefault 有键值对,不添加 dic.setdefault('k1', ...

  6. Floyd算法-傻子也能看懂的弗洛伊德算法(转)

                暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.          ...

  7. 简单的使用Nginx框架搭建Web服务器~

    系统环境Debian 8,内核版本 一.首先来安装nginx服务程序:  1.安装nginx服务需要的相关程序(记得在root权限下操作下面的指令) aptitude install libpcre3 ...

  8. Dubbo入门---搭建一个最简单的Demo框架(转)

    Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本.  ...

  9. Jmeter元件——JSON Extractor后置处理器

    场景使用 json extractor后置处理器用在返回格式为json的HTTP请求中,用来获取返回的json中的某个值.并保存成变量供后面的请求进行调用或断言等. 使用方法 1.常规操作 路径:选择 ...

  10. dns服务扩展