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

今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了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. mapreduce分区

    本次分区是采用项目垃圾分类的csv文件,按照小于4的分为一个文件,大于等于4的分为一个文件 源代码: PartitionMapper.java: package cn.idcast.partition ...

  2. CCF201503-1图像旋转

    问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输入的第一行包含 ...

  3. vue解决音频可视化播放,使用wavesurfer.js

    vue解决音频可视化播放,使用wavesurfer.js 上效果:   1.安装wavesurfer  npm install wavesurfer.js 2.在页面导入 import WaveSur ...

  4. 库存管理系统实现 C语言课设

    1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //定义一个商品结构体 6 ...

  5. 启动jar包的shell脚本

    在jar包的同级目录新建文件例如:app_jar.sh 然后填写如下内容: #!/bin/bash #source /etc/profile # Auth:Liucx # Please change ...

  6. 【LeetCode】567. 字符串的排列

    567. 字符串的排列 知识点:字符串:滑动窗口 题目描述 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列.如果是,返回 true :否则,返回 false . 换句 ...

  7. this的指向问题及改变this指向

    概念: this是运行环境下的一个系统变量, 由于this在不同的执行环境下有不同的值, 所以在使用this时,多加注意 (使用this之前,先打印) 1,在全局作用域下,this默认指向window ...

  8. eslint配置介绍-如何在uniapp中配置eslint

    eslint uniapp-eslint及vue-eslint配置 ESLint 是一个开源的 JavaScript 代码检查工具.可以让程序员在编码的过程中发现问题而不是在执行的过程中. 1. es ...

  9. 解构华为云HE2E项目中的容器技术应用

    摘要:本文从容器技术应用的角度解构了HE2E项目的代码仓库配置.镜像构建.及docker-compose的部署方式.希望通过本篇文章分享可以使更多的开发者了解容器技术和华为云. 本文分享自华为云社区& ...

  10. MKL库矩阵乘法

    此示例是利用Intel 的MKL库函数计算矩阵的乘法,目标为:\(C=\alpha*A*B+\beta*C\),由函数cblas_dgemm实现: 其中\(A\)为\(m\times k\)维矩阵,\ ...