二叉树遍历在Unity中的实现
前言:今天放一天,想到要放国庆假了就心烦气躁,躺床上又焦虑,回想起面试官的一副扑克脸,马上跳起来看了看数据结构。
今天复习了二叉树,包括一些基本概念和特性,当看到二叉树遍历的章节时,马上联想到了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中的实现的更多相关文章
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历
[二叉树遍历模版]前序遍历 1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...
- Java实现二叉树先序,中序,后序遍历
以下是我要解析的一个二叉树的模型形状 接下来废话不多直接上代码 一种是用递归的方法,另一种是用堆栈的方法: 首先创建一棵树: public class Node { private int data; ...
- Java实现二叉树的前序、中序、后序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单 ...
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...
- LeetCode二叉树的前序、中序、后序遍历(递归实现)
本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...
- 二叉树遍历(flist)(二叉树,已知中序层序,求先序)
问题 C: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 76 解决: 53[提交][状态][讨论版][命题人:quanxing][Edit] [TestDat ...
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...
- 二叉树遍历(flist)(已知中序和按层遍历,求先序 )
问题 F: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 11 解决: 9[提交][状态][讨论版][命题人:quanxing][Edit] [TestData ...
随机推荐
- mapreduce分区
本次分区是采用项目垃圾分类的csv文件,按照小于4的分为一个文件,大于等于4的分为一个文件 源代码: PartitionMapper.java: package cn.idcast.partition ...
- CCF201503-1图像旋转
问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输入的第一行包含 ...
- vue解决音频可视化播放,使用wavesurfer.js
vue解决音频可视化播放,使用wavesurfer.js 上效果: 1.安装wavesurfer npm install wavesurfer.js 2.在页面导入 import WaveSur ...
- 库存管理系统实现 C语言课设
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 //定义一个商品结构体 6 ...
- 启动jar包的shell脚本
在jar包的同级目录新建文件例如:app_jar.sh 然后填写如下内容: #!/bin/bash #source /etc/profile # Auth:Liucx # Please change ...
- 【LeetCode】567. 字符串的排列
567. 字符串的排列 知识点:字符串:滑动窗口 题目描述 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列.如果是,返回 true :否则,返回 false . 换句 ...
- this的指向问题及改变this指向
概念: this是运行环境下的一个系统变量, 由于this在不同的执行环境下有不同的值, 所以在使用this时,多加注意 (使用this之前,先打印) 1,在全局作用域下,this默认指向window ...
- eslint配置介绍-如何在uniapp中配置eslint
eslint uniapp-eslint及vue-eslint配置 ESLint 是一个开源的 JavaScript 代码检查工具.可以让程序员在编码的过程中发现问题而不是在执行的过程中. 1. es ...
- 解构华为云HE2E项目中的容器技术应用
摘要:本文从容器技术应用的角度解构了HE2E项目的代码仓库配置.镜像构建.及docker-compose的部署方式.希望通过本篇文章分享可以使更多的开发者了解容器技术和华为云. 本文分享自华为云社区& ...
- MKL库矩阵乘法
此示例是利用Intel 的MKL库函数计算矩阵的乘法,目标为:\(C=\alpha*A*B+\beta*C\),由函数cblas_dgemm实现: 其中\(A\)为\(m\times k\)维矩阵,\ ...