树的数组表示法
使用下标对应的方法来做
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataStruct_Pro.Tree
{
class Class1
{
public static void Main(string[] args)
{
int i, level;
int[] data = { 6, 3, 5, 9, 7, 8, 4, 2 }; //原始数据
int[] btree = new int[16];//二叉树的本体
for (i = 0; i < btree.Length; i++) btree[i] = 0; //赋初始值为0
Console.Write("原始数据:");
for (i = 0; i < data.Length; i++)
{
Console.Write("[{0}]", data[i]);
}
Console.WriteLine();
for (i = 0; i < data.Length; i++) //遍历原始数据数组
{
for(level = 1;btree[level] != 0;)
{
if (data[i] > btree[level])
{
level = level * 2 + 1;
}
else
level = level * 2;
}
btree[level] = data[i]; //将数据放入二叉树
}
Console.Write("二叉树内容:\n");
for (i = 1; i < btree.Length; i++)
{
Console.Write("[{0}]", btree[i]);
}
Console.WriteLine();
Console.ReadLine();
}
}
}
树的链表表示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataStruct_Pro.Tree
{
class TreeNode
{
public int value;
public TreeNode left_node;
public TreeNode right_node;
public TreeNode(int value)
{
this.value = value;
this.left_node = null;
this.right_node = null;
}
}
class BinaryTree
{
public TreeNode rootNode;
public BinaryTree(int[] data)
{
for(int i = 0; i < data.Length; i++)
{
this.Add_Node_To_Tree(data[i]);
}
}
public void InOrder(TreeNode node)
{
if(node != null)
{
InOrder(node.left_node);
Console.Write("[{0}]", node.value);
InOrder(node.right_node);
}
}
public void PostOrder(TreeNode node)
{
if(node != null)
{
PostOrder(node.left_node);
PostOrder(node.right_node);
Console.Write("[{0}]", node.value);
}
}
public void PreOrder(TreeNode node)
{
if(node != null)
{
Console.Write("[{0}]", node.value);
PreOrder(node.left_node);
PreOrder(node.right_node);
}
}
public void Add_Node_To_Tree(int value)
{
TreeNode currentNode = rootNode;
if(rootNode == null)
{
rootNode = new TreeNode(value);
return;
}
while (true)
{
if(value < currentNode.value)
{
if (currentNode.left_node == null)
{
currentNode.left_node = new TreeNode(value);
return;
}
else
currentNode = currentNode.left_node;
}
else
{
if (currentNode.right_node == null)
{
currentNode.right_node = new TreeNode(value);
return;
}
else
currentNode = currentNode.right_node;
}
}
}
}
class Class2
{
public static void Main(string[] args)
{
Console.WriteLine("请输入需要多少个节点的树:");
int ArraySize = Convert.ToInt32(Console.ReadLine());
int tempData;
int[] content = new int[ArraySize];
Console.WriteLine("请连续输入{0} 个数据.", ArraySize);
for(int i = 0; i < ArraySize; i++)
{
Console.Write("请输入第{0} 个数据: ", i + 1);
tempData = Convert.ToInt32(Console.ReadLine());
content[i] = tempData;
}
var tree = new BinaryTree(content);
Console.WriteLine("创建二叉树成功");
Console.WriteLine("=========================");
tree.InOrder(tree.rootNode);
Console.ReadLine();
}
}
}
Python版
class TreeNode:
def __init__(self,value):
self.value = value
self.Right = None
self.Left = None
class BinaryTree:
def __init__(self,content):
self.root = None
for i in content:
self.CreateTree(i)
def CreateTree(self,value):
current = self.root
if self.root is None:
self.root = TreeNode(value)
return
while(True):
if(value < current.value):
if(current.Left == None):
current.Left = TreeNode(value)
return
else:
current = current.Left
else:
if(current.Right == None):
current.Right = TreeNode(value)
return
else:
current = current.Right
def MidOrder(self,node):
if(node != None):
self.MidOrder(node.Left)
print("["+str(node.value)+"]")
self.MidOrder(node.Right)
if __name__ == "__main__":
ArraySize = int(input())
i = 0
myList = []
while(i < ArraySize):
print("请输入第"+str((i+1)),"个数据: ")
temp = int(input())
myList.append(temp)
i = i + 1
tree = BinaryTree(myList)
print("Done......")
tree.MidOrder(tree.root)
这里有一个有趣的现象,就是当使用中序遍历二叉树的时候,所遍历出来的结果是排好序的。