数据结构二叉树的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
    }
}

解决方案 »

  1.   

    更正下,是前序遍历
    补充一个后序遍历取第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); // 向左走
            }