数据结构二叉树的C#应用。可能用得着,直接拷过去就可以了,现在只是简单地存数字,存和取都可以扩展成复杂的功能。
namespace WindowsFormsApplication23
{
public partial class Form1 : Form
{
class Tree
{
public Tree Left = null;
public Tree Right = null;
public int Value;
} Tree T = null;
public Form1()
{
InitializeComponent();
} int Order = 8; // 取第几大的数
int Value ; // 放最后找到的数用
void Form1_Load(object sender, EventArgs e)
{
int[] I1 = new int[] { 45, 30, 23, 4, 1, 0, -9 };
int[] I2 = new int[] { 43, 22, 10, 5, -1 };
foreach (int value in I1)
AddToTree(ref T, value); // 把第一个数组放入二叉树
foreach (int value in I2)
AddToTree(ref T, value); // 把第二个数组放入二叉树
GetNumber(ref T);
MessageBox.Show(Value.ToString());
} void AddToTree(ref Tree T, int value)
{
if (T == null)
{
T = new Tree();
T.Value = value;
}
else if (value < T.Value) // 比当前值小的往左
AddToTree(ref T.Left, value);
else if (value > T.Value) // 比当前值大的往右
AddToTree(ref T.Right, value);
// else 相同重复的值丢弃掉
} void GetNumber(ref Tree T)
{
if (T == null)
return; // 已经没有节点了
if (T.Left != null)
GetNumber(ref T.Left); // 向左走
if (--Order == 0) // 按从小到大的顺序得到一个值,如果Order到0了说明要找到第Order个数字就是这个了
{
Value = T.Value;
return;
}
if (T.Right != null)
GetNumber(ref T.Right); // 向右走
} // 输出结果: 22 // 两次 AddToTree 创建完的二叉树是这样的
// 45
// 30
// 23 43
// 4
// 1 22
// 0 10
// -9 5
// -1
//
// GetNumber 按中序遍历:左中右的顺序过程就是 -9 -1 0 1 4 5 10 22 23 30 43 45
}
}
namespace WindowsFormsApplication23
{
public partial class Form1 : Form
{
class Tree
{
public Tree Left = null;
public Tree Right = null;
public int Value;
} Tree T = null;
public Form1()
{
InitializeComponent();
} int Order = 8; // 取第几大的数
int Value ; // 放最后找到的数用
void Form1_Load(object sender, EventArgs e)
{
int[] I1 = new int[] { 45, 30, 23, 4, 1, 0, -9 };
int[] I2 = new int[] { 43, 22, 10, 5, -1 };
foreach (int value in I1)
AddToTree(ref T, value); // 把第一个数组放入二叉树
foreach (int value in I2)
AddToTree(ref T, value); // 把第二个数组放入二叉树
GetNumber(ref T);
MessageBox.Show(Value.ToString());
} void AddToTree(ref Tree T, int value)
{
if (T == null)
{
T = new Tree();
T.Value = value;
}
else if (value < T.Value) // 比当前值小的往左
AddToTree(ref T.Left, value);
else if (value > T.Value) // 比当前值大的往右
AddToTree(ref T.Right, value);
// else 相同重复的值丢弃掉
} void GetNumber(ref Tree T)
{
if (T == null)
return; // 已经没有节点了
if (T.Left != null)
GetNumber(ref T.Left); // 向左走
if (--Order == 0) // 按从小到大的顺序得到一个值,如果Order到0了说明要找到第Order个数字就是这个了
{
Value = T.Value;
return;
}
if (T.Right != null)
GetNumber(ref T.Right); // 向右走
} // 输出结果: 22 // 两次 AddToTree 创建完的二叉树是这样的
// 45
// 30
// 23 43
// 4
// 1 22
// 0 10
// -9 5
// -1
//
// GetNumber 按中序遍历:左中右的顺序过程就是 -9 -1 0 1 4 5 10 22 23 30 43 45
}
}
补充一个后序遍历取第N小值void GetNumber2(ref Tree T)
{
if (T == null)
return; // 已经没有节点了
if (T.Right != null)
GetNumber(ref T.Right); // 向右走
if (--Order == 0) // 按从大到小的顺序得到一个值,如果Order到0了说明要找到第Order个数字就是这个了
{
Value = T.Value;
return;
}
if (T.Left != null)
GetNumber2(ref T.Left); // 向左走
}