前言:今天放一天,想到要放国庆假了就心烦气躁,躺床上又焦虑,回想起面试官的一副扑克脸,马上跳起来看了看数据结构。

今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了Unity的Hierachy面板中的游戏物体关系,就在Unity中仿造了一波”二叉树“;

准备工作:

先写一个二叉树类,成员包括自身名称value,左子树,右子树

public class BinaryTree
{
public string value;
public BinaryTree Left;
public BinaryTree Right; public BinaryTree(Transform root)
{
value = root.name;
if (root.childCount==0)
{
return;
}
else if (root.childCount==1)
{
if (root.GetChild(0) != null)
{
Left = new BinaryTree(root.GetChild(0));
}
else
{
Left = null;
}
}
else if (root.childCount==2)
{
if (root.GetChild(0) != null)
{
Left = new BinaryTree(root.GetChild(0));
}
else
{
Left = null;
} if (root.GetChild(1) != null)
{
Right = new BinaryTree(root.GetChild(1));
}
else
{
Right = null;
}
}
}
}

在Unity中添加若干子物体

因为Unity中,游戏物体的关系并非是《二叉树》,而是《树》,所以在代码中我特意添加判断子物体数,而且在Unity中不会出现左子树不存在,右子树存在的情况。

一、先序遍历

1.递归方式:

void NodeFirst(BinaryTree t)
{
if (t!=null)
{
Debug.Log(t.value);
NodeFirst(t.Left);
NodeFirst(t.Right);
}
}

2.非递归方式:

void TravalFirst(BinaryTree input)
{
BinaryTree T = input;
Stack<BinaryTree> s = new Stack<BinaryTree>();
while (T!=null||s.Count>0)
{
while (T!=null)
{
Debug.Log(T.value);
s.Push(T);
T = T.Left;
}
T = s.Pop();
T = T.Right;
}
}

3.输出:

二、中序

1.递归

void NodeMid(BinaryTree t)
{
if (t != null)
{
NodeMid(t.Left);
Debug.Log(t.value);
NodeMid(t.Right);
}
}

2.非递归

void TravalMid(BinaryTree input)
{
BinaryTree T = input;
Stack<BinaryTree> s = new Stack<BinaryTree>();
while (T!=null|| s.Count>0)
{
while (T!=null)
{
s.Push(T);
T = T.Left;
}
T = s.Pop();
Debug.Log(T.value);
T = T.Right;
}
}

3.输出

三、后序

1.递归

void NodeLast(BinaryTree t)
{
if (t != null)
{
NodeLast(t.Left);
NodeLast(t.Right);
Debug.Log(t.value);
}
}

2.非递归

void TravalLast(BinaryTree input)
{
BinaryTree T = input;
Stack<BinaryTree> s = new Stack<BinaryTree>();
BinaryTree visited = null;
while (T!=null||s.Count>0)
{
if (T!=null)
{
s.Push(T);
T = T.Left;
}
else
{
T = s.Peek();
if (T.Right!=null&&visited!=T.Right)
{
T = T.Right;
s.Push(T);
T = T.Left;
}
else
{
T = s.Pop();
Debug.Log(T.value);
visited = T;
T = null;
}
}
}
}

这里单独解释一下,因为我做这个实在是想不出了,看了看网上的,其实我也是云里雾里的。这里不能像前两个一样,早早的把父节点弹出栈,需要先输出判断左右子树后,再弹出父节点。

3.输出

其实我更愿意用递归,因为非递归的可读性有点差。考虑到可执行性的原因,所以我又学习了一遍非递归的方式,主要还是使用栈的特性。加油,菜鸟也有鲲鹏之志

二叉树遍历在Unity中的实现的更多相关文章

  1. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

  3. Java实现二叉树先序,中序,后序遍历

    以下是我要解析的一个二叉树的模型形状 接下来废话不多直接上代码 一种是用递归的方法,另一种是用堆栈的方法: 首先创建一棵树: public class Node { private int data; ...

  4. Java实现二叉树的前序、中序、后序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...

  5. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  6. LeetCode二叉树的前序、中序、后序遍历(递归实现)

    本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...

  7. 二叉树遍历(flist)(二叉树,已知中序层序,求先序)

    问题 C: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 76  解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...

  8. Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)

      在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...

  9. 二叉树遍历(flist)(已知中序和按层遍历,求先序 )

    问题 F: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交][状态][讨论版][命题人:quanxing][Edit] [TestData ...

随机推荐

  1. input type='file'限制上传文件类型

    前端与后台数据进行对接时,就避免不了要使用ajax进行http请求,常用的请求就两个post与get:然而常见的post请求的需求是文件上传,可能我一说到文件上传大家都觉得so  easy啊,没什么嘛 ...

  2. [前端学习]vue的指令学习记录 vu-if | text | for | on | model | bind | pre

    vue的指令学习记录 vue-if | text | for | on | model - 目录 vue的指令学习记录 vue-if | text | for | on | model ... 预备 ...

  3. WebSocket学习笔记

    参考文章链接:http://www.ruanyifeng.com/blog/2017/05/websocket.html 简单示例:https://www.yiibai.com/websocket/p ...

  4. 《java基础——对象的拷贝》

    java基础--对象的拷贝 一.浅拷贝: 规则: 1. 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化. 2. 浅拷贝相当于两个对象共用一套实例. 格式: 类名 对象 ...

  5. kali下安装docker

    前期准备 物理机:win10 虚拟机:kali 2021 网络连接方式:桥接 一.简介 Vulhub: 是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译.运行一个完整的漏洞 ...

  6. JavaScript学习高级2

    ## DOM:     * 概念: Document Object Model 文档对象模型         * 将标记语言文档的各个组成部分,封装为对象.可以使用这些对象,对标记语言文档进行CRUD ...

  7. 2021.07.02 P1383 高级打字机题解(可持久化平衡树)

    2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...

  8. Kafka生成消息时的3种分区策略

    摘要:KafkaProducer在发送消息的时候,需要指定发送到哪个分区, 那么这个分区策略都有哪些呢? 本文分享自华为云社区<Kafka生产者3中分区分配策略>,作者:石臻臻的杂货铺. ...

  9. rocketmq消息及流程

    1.为什么用mq 优势 主要有3个: 应用解耦(降低微服务之间的关联). 异步提速(微服务拿到mq消息后同时工作). 削峰填谷(可以消息堆积) 劣势 系统可用性降低(MQ一旦宕机整个系统不可用) 复杂 ...

  10. Django学习——路由层之路由匹配、无名分组、有名分组、反向解析

    路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...