[ZT]线索二叉树(C#数据结构五)

  1using System;
  2
  3namespace BiThrTree
  4{
  5    /// <summary>
  6    /// 定义结点类:
  7    /// </summary>

  8    class BTNode
  9    {
 10        //先序:先处理父结点,然后递归处理孩子
 11        //中序:先处理左孩子,再处理根节结,然后递归处理右孩子
 12        //后序:先递归处理所有孩子,再递归处理节点本点
 13        public char data;
 14        public int ltag, rtag;//0表示线索,1表示结点
 15        public BTNode lchild, rchild;
 16    }

 17    class BiThrTree
 18    {
 19        /// <summary>
 20        /// 建立一棵新二叉树:
 21        /// </summary>
 22        /// <param name="T"></param>

 23        static public void CreateBiThrTree(ref BTNode T)
 24        {
 25            char ch;
 26            ch = (char)Console.Read();
 27            if (ch == '#')
 28            {
 29                T = null;
 30            }

 31            else
 32            {
 33                T = new BTNode();
 34                T.data = ch;
 35                CreateBiThrTree(ref T.lchild);
 36                CreateBiThrTree(ref T.rchild);
 37            }

 38        }

 39        /// <summary>
 40        /// 线索化二叉树:
 41        /// </summary>
 42        /// <param name="T"></param>

 43        static BTNode pre, H;
 44        static public void Threading(ref BTNode T)
 45        {
 46            H = pre = new BTNode();
 47            pre.rchild = pre.lchild = null;
 48            pre.rtag = pre.ltag = 0;
 49            Thread(ref T);
 50        }

 51        static public void Thread(ref BTNode T)
 52        {
 53            if (T != null)
 54            {
 55                if (T.lchild == null{ T.lchild = pre; T.ltag = 0; }
 56                else { T.ltag = 1; }
 57                if (T.rchild == null{ T.rtag = 0; }
 58                else { T.rtag = 1; }
 59                if (pre.rchild == null && pre.rtag == 0) pre.rchild = T;
 60                pre = T;
 61                if (T.ltag == 1) Thread(ref T.lchild);
 62                if (T.rtag == 1) Thread(ref T.rchild);
 63            }

 64        }

 65        /// <summary>
 66        /// 先序输出:
 67        /// </summary>

 68        static public void PrePrint(BTNode T)
 69        {
 70            if (T != null)
 71            {
 72                Console.Write(T.data + "\t");
 73                if (T.ltag == 1) PrePrint(T.lchild);
 74                if (T.rtag == 1) PrePrint(T.rchild);
 75            }

 76        }

 77        /// <summary>
 78        /// 先序线索遍历输出:
 79        /// </summary>

 80        static public void PreThrPrint(BTNode T)
 81        {
 82            T = H.rchild;
 83            //Console.WriteLine("H.rchild.date::"+H.rchild.data);
 84            while (T != null)
 85            {
 86                Console.Write(T.data + "\t");
 87                if (T.rtag == 0) T = T.rchild;
 88                else
 89                {
 90                    if (T.ltag == 1) T = T.lchild;
 91                    else
 92                    {
 93                        T = T.rchild;
 94                    }

 95                }

 96            }

 97        }

 98        /// <summary>
 99        /// Deepth of a BiThrTree:
100        /// </summary>

101        static public int Deepth(BTNode T)
102        {
103            int a, b;
104            if (T != null)
105            {
106                if (T.ltag == 1) a = Deepth(T.lchild); else a = 0;
107                if (T.rtag == 1) b = Deepth(T.rchild); else b = 0;
108                return (1 + max(a, b));
109            }

110            else
111            {
112                return 0;
113            }

114        }

115        static public int max(params int[] w)
116        {
117            int max;
118            max = w[0];
119            for (int i = 0; i < w.Length; i++)
120                if (max < w[i]) max = w[i];
121            return max;
122        }

123        /// <summary>
124        /// 复制线索二叉树:
125        /// </summary>

126        static public void DulplicateBiThrTree(BTNode T1, ref BTNode T2)
127        {
128            if (T1 != null)
129            {
130                T2 = new BTNode();
131                T2.data = T1.data;
132                T2.ltag = T1.ltag; T2.rtag = T1.rtag;
133                if (T2.ltag == 1) DulplicateBiThrTree(T1.lchild, ref T2.lchild); else T2.lchild = T1.lchild;
134                if (T2.rtag == 1) DulplicateBiThrTree(T1.rchild, ref T2.rchild); else T2.rchild = T1.rchild;
135            }

136        }

137
138        static void Main()
139        {
140            BTNode mytree = null;
141            Console.WriteLine("Please input a tree(for example:abc##d##ed###):");
142            CreateBiThrTree(ref mytree);
143            Threading(ref mytree);
144            PrePrint(mytree);
145            Console.WriteLine("\n按先序输出:\n");
146            PreThrPrint(mytree);
147            Console.WriteLine("\n该树的深度为:{0}", Deepth(mytree));
148            BTNode mytree2 = null;
149            Console.WriteLine("调用复制函数得到的新树为:");
150            DulplicateBiThrTree(mytree, ref mytree2);
151            PrePrint(mytree2);
152            Console.ReadLine();
153            Console.ReadLine();
154        }

155
156    }

157
158}

posted on 2006-12-21 19:46  Haozes  阅读(503)  评论(0编辑  收藏  举报