一页孤舟

学海无涯

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

namespace ThreadTree

{
    class Program
    {
        static void Main(string[] args)
        {
            ThreadBinaryTree tree = new ThreadBinaryTree();
            tree.InitialTree(@"a(b,c(d,e))");
            tree.InThread();
            tree.Print();
          //  tree.InOrder();
           // tree.Print();
            //tree.PrintTree();
            //tree.InOrder();
            //tree.PostOrder();
            //tree.PreOrder();
            //tree.LevelOrder();
            Console.WriteLine(tree.TreeDepth());
        }

        public class TreeNode
        {
            public TreeNode(object element)
            {
                this.element = element;
            }
            TreeNode left;

            public TreeNode Left
            {
                get { return left; }
                set { left = value; }
            }
            TreeNode right;

            public TreeNode Right
            {
                get { return right; }
                set { right = value; }
            }
            object element;

            public object Element
            {
                get { return element; }
                set { element = value; }
            }

            int leftFlag;

            public int LeftFlag
            {
                get { return leftFlag; }
                set { leftFlag = value; }
            }


            int rightFlag;

            public int RightFlag
            {
                get { return rightFlag; }
                set { rightFlag = value; }
            }

          
        }

        public class ThreadBinaryTree
        {
            TreeNode root;
            ArrayList list = new ArrayList();
            public ThreadBinaryTree()
            {
                root = null;
            }

            private void ParseExpression(string expression)
            {
                char temp;
                string node = string.Empty;
                for (int i = 0; i < expression.Length; i++)
                {
                    temp = expression[i];
                    if (IsNodeCharacter(temp))
                    {

                        node += temp;
                        while (++i < expression.Length && IsNodeCharacter(expression[i]))
                        {
                            node += expression[i];
                        }
                        list.Add(node);
                        node = "";
                        if (i >= expression.Length)
                        {
                            break;
                        }
                        else
                        {
                            i--;
                        }
                    }
                    else
                    {
                        list.Add(temp);
                    }
                }

                //for (int i = 0; i < list.Count; i++)
                //{
                //    Console.WriteLine(list[i].ToString() + " ");
                //}
            }

            private bool IsNodeCharacter(char temp)
            {
                if (temp == '(' || temp == ')' || temp == ',')
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }

            public void InitialTree(string expression)
            {
                ParseExpression(expression);

                string temp;
                int k = 0;
                Stack stack = new Stack();
                TreeNode node = null;
                for (int i = 0; i < list.Count; i++)
                {
                    temp = list[i].ToString();
                    switch (temp)
                    {
                        case "(":
                            k = 1;
                            stack.Push(node);
                            break;
                        case ")":
                            stack.Pop();
                            break;
                        case ",":
                            k = 2; break;
                        default:
                            node = new TreeNode(temp);
                            if (root == null)
                            {
                                root = node;
                            }
                            else
                            {
                                if (k == 1)
                                {
                                    (stack.Peek() as TreeNode).Left = node;
                                }
                                else if (k == 2)
                                {
                                    (stack.Peek() as TreeNode).Right = node;
                                }
                            }
                            break;

                    }
                }
            }


            

            public int TreeDepth()
            {
                return TreeDepth(root);
            }
            private int TreeDepth(TreeNode node)
            {
                if (node != null)
                {
                    if (node.LeftFlag == 1 && node.RightFlag == 1)
                    {
                        return 1;
                    }
                    else
                    {
                        int leftDepth = TreeDepth(node.Left);
                        int rightDepth = TreeDepth(node.Right);
                        if (leftDepth > rightDepth)
                        {
                            return leftDepth + 1;
                        }
                        else
                        {
                            return rightDepth + 1;
                        }
                    }
                }
                return 0;
            }

            public void PrintTree()
            {
                PrintTree(root);
                Console.WriteLine();
            }
            private void PrintTree(TreeNode node)
            {
                if (node != null)
                {
                    Console.Write(node.Element);
                    if (node.Left != null || node.Right != null)
                    {
                        Console.Write("(");
                        PrintTree(node.Left);
                        if (node.Right != null)
                        {
                            Console.Write(",");
                        }
                        PrintTree(node.Right);
                        Console.Write(")");
                    }
                }
            }

            public void DeleteTree()
            {
                root = null;
            }


            public void InThread()
            {
                InThread(root);
            }
            private TreeNode pre=null;
            private void InThread(TreeNode root)
            {
                if (root != null)
                {
                    if (root.LeftFlag==0)
                    {
                        InThread(root.Left);
                    }

                    if (pre != null && pre.RightFlag == 1)
                    {
                        pre.Right = root;
                    }
                    if (root.Left == null)
                    {
                        root.LeftFlag = 1;
                        root.Left = pre;
                    }
                    if (root.Right == null)
                    {
                        root.RightFlag = 1;
                    }

                    pre = root;

                    if (root.RightFlag == 0)
                    {
                        InThread(root.Right);
                    }
                }
            }


           
            private TreeNode InorderNext(TreeNode node)
            {
                if (node.RightFlag == 1)
                {
                    return node.Right;
                }
                else
                {
                    node = node.Right;
                    while (node.LeftFlag==0)
                    {
                        node = node.Left;
                    }
                    return node;
                }
            }


            public void Print()
            {
                TreeNode temp = root;
                if (temp != null)
                {
                    while (temp.LeftFlag == 0)
                    {
                        temp = temp.Left;
                    }
                    do
                    {
                        Console.Write(temp.Element);
                        temp = InorderNext(temp);
                    }
                    while (temp != null);
                }
                
            }
        }
    }
}
posted on 2009-03-14 08:32  LinLi  阅读(309)  评论(0)    收藏  举报