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

今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了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. 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子

    首先要做一个诚挚的道歉,作为大四狗,因为升学的事情,断更两个月,所以要感谢各位仁慈的读者没有脱粉(好像也就50个粉丝).这一节,我们延续上一节制作的页面,来讨论声明周期钩子的事情. 以我的经验来看,多 ...

  2. python-输入列表,求列表元素和(eval输入应用)

    在一行中输入列表,输出列表元素的和. 输入格式: 一行中输入列表. 输出格式: 在一行中输出列表元素的和. 输入样例: [3,8,-5] 输出样例: 6 代码: a = eval(input()) t ...

  3. C#编写一个计算器

    编写一个计算器,练习在窗体上添加控件.调整控件的布局,设置或修改控件属性,编写事件处理程序的方法. 代码: using System; using System.Collections.Generic ...

  4. nodejs创建服务器

      'use strict'; //加载http模块: const http = require('http'); //创建一个http服务: const server = http.createSe ...

  5. python---二叉树广度优先和深度优先遍历的实现

    class Node(object): """结点""" def __init__(self, data): self.data = dat ...

  6. Linux---必备命令(2)

    进程相关命令 # 查看系统所有的进程 ps -ef ps -ef | grep vim # 过滤出vim有关的进程 ps -ef | grep vim # 过滤出22端口的信息 ps -tunlp | ...

  7. Linux小工具的应用,grep,sort,wc,cut

    小工具的使用: 1.管道(|):连接多个命令的工具,进程之间通讯的一种方式 用法:命令1 | 命令2 | 命令3....2.grep工具:行过滤,打印出的结果一行一行的 用法:grep options ...

  8. 导出带标签的tar包(docker)-解决导出不带标签的麻烦

    需求:在docker的本地镜像库中导出tar包给其他节点使用. 如果使用:docker save -o package.tar e82656a6fc 这样形式导出的tar包,安装之后标签会消失解决办法 ...

  9. 帝国cms7.5忘记登录密码以及多次登录失败被锁定终极解决办法

    其实网上很多忘记登录密码的解决方法都是相对于7.5版本以下的,在7.5的版本里根本不适用,今天小编主要给大家说的是针对帝国cms7.5忘记登录密码正确的解决办法. 前提是你能登陆服务器: 一.忘记登录 ...

  10. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...