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

今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了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. python-使用函数求余弦函数的近似值

    本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加): cos(x)=0!x0​−2!x2​+4!x4​−6!x6​+... 函数接口定 ...

  2. Android设置TextView为不可见

    通常控件的可见与不可见分为三种情况. 第一种    gone         表示不可见并且不占用空间 第二种    visible       表示可见 第三种    invisible    表示 ...

  3. Java JDK 动态代理实现和代码分析

    JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...

  4. CSS简单样式练习(五)

    运行效果: 源代码: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta char ...

  5. 耗时一个月上架了一款微信小程序,赚了2022年的第一笔副收入

    今天不谈技术,只谈经历. 前戏 相信有很多的程序员都有一个产品梦,希望有一款属于自己产品.毕竟工作中遇到的有些"脑残"的产品经理不是一个两个,最后不得不因为"技术服务于业 ...

  6. C语言,最大公约数---更相减损术

    // 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...

  7. Kubernetes架构-图解

  8. 从电路到UI系列之一——常见显示控制接口的认识

    引入 我之前有两方面的使用屏幕的案例.在做的模块上需要用到屏幕来显示的时候,全是SPI屏幕,并口屏幕和IIC屏幕.在研究了驱动(或者是绘图函数更加合适)之后,我发现其实他们就是直接写显存,这个显存在面 ...

  9. Python 国家地震台网中心地震数据集完整分析、pyecharts、plotly,分析强震次数、震级分布、震级震源关系、发生位置、发生时段、最大震级、平均震级

    注意,本篇内容根据我老师布置的数据分析作业展开.请勿抄袭,后果自负! 前情提要 编写这篇文章是为了记录自己是如何分析地震数据集,使用模块,克服一系列 \(bug\) 的过程.如果你是 \(python ...

  10. MKL与VS2019配置方法

    VS2019配置oneAPI并调用MKL库 oneAPI oneAPI是一个跨架构的编程工具,旨在简化跨GPU.CPU.FPGA和AI加速器之间的编程,可以与英特尔自身设备,或其他厂商的芯片配合使用, ...