二叉树是最简单的树结构,树结构为层次结构,与之对应的是线性结构,例如数组,链表等。经历过的游戏项目中线性表用得比较多,相比之下,树结构用的就比较少了,也许是笔者孤陋寡闻,单方面认为树适用于大数据量的存储,排序等操作,游戏服务器可承载数据量也挺大,但是处理能力和一些硬性要求(内存,硬盘)也有限,再锋利的刀刃用的时间长了也会钝,服务器卡顿会带来客户端非常操蛋的游戏体验,所以为了长久之计,不建议在游戏服上对数据做频繁的排序操作,更别说在数据量很大的情况下了。
以上85.8%为废话
什么是二叉树
和数组的结构比较就会非常清楚了。如图
- 数组
二叉树
码钳
- c#里递归方法里有修改对象的操作,最好加上ref关键字
- 插入方式为:相比根节点小放在左节点,比根节点大放到右节点,这样按照中序遍历(根左右)的方式遍历得到的是升序数列。
这棵树为二叉排序树(以下insert方法决定,可以通过一定的遍历方式得到有序数列)
简单实现(C# in Unity)
using UnityEngine;
using System.Collections;
using System;
/// <summary>
/// 最简单的二叉树
/// wc 2017/5/26
/// </summary>
public class binary_tree_Node
{
public binary_tree_Node LeftNode;
public binary_tree_Node RightNode;
public int value;
}
public class binary_tree {
public binary_tree_Node root;
private string values = "";
//插入
public void Insert(int value) {
insert(ref root,value);
}
private void insert(ref binary_tree_Node node, int value)
{
if(node == null){
node = new binary_tree_Node();
node.LeftNode = null;
node.RightNode = null;
node.value = value;
return;
}
if (value <= node.value)
{
insert(ref node.LeftNode, value);
}
else if (value > node.value)
{
insert(ref node.RightNode, value);
}
}
//前序遍历
public void Preorder()
{
values = "";
preorder(root);
Debug.Log("前序遍历: " + values);
}
private void preorder(binary_tree_Node node)
{
if (node != null)
{
values += node.value + ",";
preorder(node.LeftNode);
preorder(node.RightNode);
}
}
//中序遍历
public void Inorder()
{
values = "";
inorder(root);
Debug.Log("中序遍历: " + values);
}
private void inorder(binary_tree_Node node)
{
if (node != null)
{
inorder(node.LeftNode);
values += node.value + ",";
inorder(node.RightNode);
}
}
//后序遍历
public void PostOrder() {
values = "";
postOrder(root);
Debug.Log("后序遍历: " + values);
}
private void postOrder(binary_tree_Node node)
{
if (node != null)
{
postOrder(node.LeftNode);
postOrder(node.RightNode);
values += node.value + ",";
}
}
//删除
public void DeleteTree() {
deleteTree(ref root);
Debug.Log("删除树");
}
public void deleteTree(ref binary_tree_Node node)
{
if(node != null){
binary_tree_Node nodeLeft = node.LeftNode;
binary_tree_Node nodeRight = node.RightNode;
deleteTree(ref nodeLeft);
deleteTree(ref nodeRight);
node = null;
}
}
}
public class TestTree : MonoBehaviour
{
void Start()
{
binary_tree tree = new binary_tree();
string rands = "";
for (int i = 0; i < 8; i++)
{
int random = UnityEngine.Random.Range(0, 100);
tree.Insert(random);
rands +=random + ",";
}
print("原始数列: " + rands);
tree.Preorder();
tree.Inorder();
tree.PostOrder();
tree.DeleteTree();//删除整个树
tree.Preorder();
tree.Inorder();
tree.PostOrder();
}
}