边复习边写(树的操作)

21 篇文章 0 订阅
11 篇文章 0 订阅
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ArrayFind
{
    /*****************************
     剑指offer 名企面试官精讲典型编程题
     */
    /*********:面试题3**********/
    class Matrix
    {
        private int[,] m_data;
        private int row=4, coloum=4;
        public Matrix()
        {
            m_data = new int[4,4]{{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        }
        public void Show()
        {
            for (int i = 0; i < 4; i++)
            { 
                for (int j = 0; j < 4; j++)
                    Console.Write( m_data[i, j]+"   ");
                Console.WriteLine();
            }
        }
        public bool Find(int number)
        {
            bool found=false;
            if (this == null || row <= 0 || coloum <= 0)
                return false;
            row =0;
            coloum = coloum - 1;
            while (row < 4 && coloum >= 0)
            {
                if (m_data[row, coloum] == number)
                {
                    found = true;
                    break;
                }
                else if (m_data[row, coloum] > number)
                    coloum--;
                else
                    row++;
            }
            Console.WriteLine(found);
            return found;
        }
    }
    /*********:面试题4**********/
    class StringReplace
    {
        private char[] _str;
        private int _len=100;
        public StringReplace(int len)
        {
            _len = len;
            _str = new char[_len];
            
        }

        public StringReplace(char[] str)
        {
            _str = new char[_len];
            //str.CopyTo(_str, 0);
            for (int i = 0; i < str.Length; i++)
                _str[i] = str[i];
        }
        public void Show()
        {
            Console.WriteLine(_str);
        }
        public void Replace()
        {
            if (_str == null && _len <= 0)
                return;
            int originalLength = 0;
            int numberofBlank = 0;
            int i = 0;
            while (_str[i] !='\0' )
            {
                ++originalLength;
                if (_str[i] == ' ')
                    ++numberofBlank;
                ++i;
            }
            int newLength = originalLength + numberofBlank * 2;

            if (newLength > _len)
                return;
            int indexOfold = originalLength;
            int indexofnew = newLength;

            while (indexOfold >= 0 && indexofnew > indexOfold)
            {
                if (_str[indexOfold] == ' ')
                {
                    _str[indexofnew--] = '0';
                    _str[indexofnew--] = '2';
                    _str[indexofnew--] = '%';
                }
                else
                {
                    _str[indexofnew--] = _str[indexOfold];
                }
                --indexOfold;
            }
        }
    }

        class Tree<T> where T : IComparable<T>
    {
        private T data;
        private Tree<T> left;
        private Tree<T> right;


        public Tree(T nodeValue)
        {
            this.data = nodeValue;
            this.left = null;
            this.right = null;
        }


        public Tree()
        {
            // TODO: Complete member initialization
        }


        public T NodeData
        {
            get { return this.data; }
            set { this.data = value; }
        }


        public Tree<T> LeftTree
        {
            get { return this.left; }
            set { this.left = value; }
        }
        public Tree<T> RightTree
        {
            get { return this.right; }
            set { this.right = value; }
        }


        public void Insert(T newItem)
        {
            T currentNodeValue = this.NodeData;
            if (currentNodeValue.CompareTo(newItem) > 0)
            {
                if (this.LeftTree == null)
                {
                    this.LeftTree = new Tree<T>(newItem);
                }
                else
                {
                    this.LeftTree.Insert(newItem);
                }
            }
            else
            {
                if (this.RightTree == null)
                {
                    this.RightTree = new Tree<T>(newItem);
                }
                else
                {
                    this.RightTree.Insert(newItem);
                }
            }
        }


        public void PreOrderTree(Tree<T> root)
        {
            if (root != null)
            {
                Console.Write(root.NodeData+"--");
                PreOrderTree(root.LeftTree);
                PreOrderTree(root.RightTree);
            }
        }


        public void InOrderTree(Tree<T> root)
        {
            if (root != null)
            {
                InOrderTree(root.LeftTree);
                Console.Write(root.NodeData + "--");
                InOrderTree(root.RightTree);
            }
        }


        public void PostOrderTree(Tree<T> root)
        {
            if (root != null)
            {
                PostOrderTree(root.LeftTree);
                PostOrderTree(root.RightTree);
                Console.Write(root.NodeData + "--");
            }
        }
        public int Depth(Tree<T> root)
        {
            if (root == null)
                return 0;
            return Math.Max( Depth(root.LeftTree),Depth(root.RightTree))+1;
        }
        #region 二叉树中和为某一值的路径
        public void FindPath(Tree<int> root,int expectedSum)
        {
            //if(num.GetType()!="int") {}
            if (root == null)
                return;
            List<Tree<int>> path = new List<Tree<int>>();
            int currentSum = 0;
            FindPath(root, expectedSum, ref path, ref currentSum);
        }
        public void FindPath(Tree<int> root, int expectedSum, ref List<Tree<int>> path, ref int currentSum)
        {
            currentSum += root.data;
            path.Add(root);


            Boolean isLeaf = root.LeftTree == null && root.RightTree == null;


            if (isLeaf && currentSum == expectedSum)
            {
                Console.WriteLine("A path is found:");
                foreach (Tree<int> pNode in path)
                {
                    Console.Write(pNode.data + "  ");
                }
                Console.WriteLine();
            }
            if(root.LeftTree!=null)
            {
                FindPath(root.LeftTree, expectedSum, ref path, ref currentSum);
               
            }
            if (root.RightTree != null)
            {
                FindPath(root.RightTree, expectedSum, ref path, ref currentSum);
            }
            currentSum -= root.data;
            path.RemoveAt(path.Count()-1);
        }
        #endregion
        #region 判断一棵树是否为平衡二叉树
        public bool IsBanlance(Tree<T> root)
        {


            if (root == null)
                return true;
            bool isBanlance= Math.Abs( Depth(root.LeftTree) - Depth(root.RightTree))>1?false:true;
            if (isBanlance == false)
                return false;
            else
                return IsBanlance(root.LeftTree) && IsBanlance(root.RightTree);
            
        }
        #endregion
        #region 打印二叉树的结构,
        public void TreePrint(Tree<T> root,Tree<T> flag)
        {
            String str = new String('*', 4);
            Queue<Tree<T>> queue = new Queue<Tree<T>>();
            if (root == null)
                return;
            queue.Enqueue(root);
            int i = 0, j = 0;
            int depth = Depth(root);
            while (queue.Count>0)
            {


                Tree<T> temp = queue.Dequeue();
                if (temp.data.CompareTo(flag.data) == 0)
                {
                    for (int p = 0; p < Convert.ToInt32(Math.Pow(2, depth)); p++)
                        Console.Write(str);
                }
                else
                {
                    for (int p = 0; p < Convert.ToInt32(Math.Pow(2, depth) / 2); p++)
                        Console.Write(str);
                    Console.Write(temp.data);
                    for (int p = 0; p < Convert.ToInt32(Math.Pow(2, depth) / 2); p++)
                        Console.Write(str);
                }
               
                if (depth>0)
                {
                    if (temp.LeftTree != null)
                        queue.Enqueue(temp.LeftTree);
                    else
                        queue.Enqueue(flag);


                    if (temp.RightTree != null)
                        queue.Enqueue(temp.RightTree);
                    else
                        queue.Enqueue(flag);
                }
                if (i == j)
                {
                    i = 0;
                    j = queue.Count()-1;
                    depth--;
                    Console.WriteLine();
                }
                else
                    i++;
            }
        }
        #endregion


        public Tree<T> Construct(List<T> preoder,List<T> inorder )
        {
            if (preoder.Count == 0 || inorder.Count == 0 || (preoder.Count != inorder.Count))
                return null;
            Tree<T> root=null;
            root =ConstructCore(preoder, inorder);
            return root;
        }
        #region 树的重建
        Tree<T> ConstructCore(List<T> preoder, List<T> inorder)
        {
           // root.data = preoder[0];
            //root.LeftTree = root.RightTree = null;


            if (preoder.Count == 0||inorder.Count==0)
                return null;
            int i = 0;
            while (i < preoder.Count && preoder[0].CompareTo( inorder[i])!=0)
                i++;
            Tree<T> root = new Tree<T>(preoder[0]);
            if (i == 0)
            {
                root.LeftTree = null;
                root.RightTree = ConstructCore(preoder.GetRange(i + 1, preoder.Count - i - 1), inorder.GetRange(i + 1, inorder.Count - i - 1));
            }
            else if (i == preoder.Count - 1)
            {
                root.RightTree = null;
                root.LeftTree = ConstructCore(preoder.GetRange(1, i), inorder.GetRange(0, i));
            }
            else
            {
                root.LeftTree = ConstructCore(preoder.GetRange(1, i), inorder.GetRange(0, i));
                root.RightTree = ConstructCore(preoder.GetRange(i + 1, preoder.Count - i - 1), inorder.GetRange(i + 1, inorder.Count - i - 1));
            }
            return root;
        }
        #endregion


        #region 树的子结构
        public bool HasSubTree(Tree<T> root1, Tree<T> root2)
        {
            bool restult = false;
            if (root1 != null && root2 != null)
            {
                if (root1.NodeData.CompareTo(root2.NodeData) == 0)
                    restult = DoesTree1HasTree2(root1, root2);
                if (!restult)
                    restult = HasSubTree(root1.LeftTree, root2);
                if (!restult)
                    restult = HasSubTree(root1.RightTree, root2);
            }
            return restult;
        }
        public bool DoesTree1HasTree2(Tree<T> root1, Tree<T> root2)
        {
            if (root2 == null)
                return true;
            if (root1 == null)
                return false;
            if (root1.NodeData.CompareTo(root2.NodeData) != 0)
                return false;
            return DoesTree1HasTree2(root1.LeftTree, root2.LeftTree) && DoesTree1HasTree2(root1.RightTree, root2.RightTree);
        }
        #endregion
        /// <summary>
        /// 判断一个序列是否为二叉搜索树的后序序列
        /// </summary>
        /// <param name="sequence"></param>
        /// <returns></returns>
        public Boolean VerifySequenceOfBST(List<T> sequence)
        {
            if (sequence.Count == 0)
                return false;
            T root = sequence.Last();
            int i = 0;
            for (; i < sequence.Count-1; i++)
            {
                if (sequence[i].CompareTo( root)>0)
                    break;
            }
            int j = i;
            for (; j < sequence.Count - 1; j++)
                if (sequence[j].CompareTo(root) < 0)
                    return false;
            bool left = true;
            bool right = true;
            if(i>0)
                left = VerifySequenceOfBST(sequence.GetRange(0,i));
            if (i < sequence.Count - 1)
                right = VerifySequenceOfBST(sequence.GetRange(i+1,sequence.Count-1));
            return left && right;
        }


        public Tree<T> ConvertTreeToDList()
        {
            Tree<T> pLastNodeInList = null;
            ConvertNode(this, ref pLastNodeInList);


            Tree<T> pHeadOfList = pLastNodeInList;
           
            while (pHeadOfList != null && pHeadOfList.left != null)
                pHeadOfList = pHeadOfList.left;
            Console.WriteLine("\n*****转换后*****");
            pLastNodeInList= pHeadOfList;
            while (pLastNodeInList != null)
            {
                Console.Write(pLastNodeInList.data + "--");
                pLastNodeInList = pLastNodeInList.right;
            }
            Console.WriteLine("\n*****end*****");
            return pHeadOfList;
        }
        public void ConvertNode(Tree<T> pNode,ref Tree<T> pLastNodeInlist)
        {
            if (pNode == null)
                return;
            Tree<T> pCurrent = pNode;
            if (pNode.LeftTree != null)
                ConvertNode(pNode.LeftTree,ref pLastNodeInlist);
            pCurrent.LeftTree = pLastNodeInlist;
            if (pLastNodeInlist != null)
                pLastNodeInlist.RightTree = pCurrent;
            pLastNodeInlist = pCurrent;
            if(pCurrent.RightTree!=null)
                ConvertNode(pNode.RightTree, ref pLastNodeInlist);
        }
    }
    }
    class Program
    {
        internal static void Modify( String text) 
        {
            text="world";
        }
        static void Main(string[] args)
        {
            Matrix matrix = new Matrix();
            matrix.Show();
            matrix.Find(7);

            String  str = "Hello";
            str.ToUpper();
           
            Modify(str);
            char[] str1 ="a b c d e\0".ToCharArray();
            StringReplace sr=new StringReplace(str1);
            sr.Replace();
            sr.Show();
            
            Tree<int> tree = new Tree<int>(10);
            tree.Insert(15);
            tree.Insert(6);
            tree.Insert(7);
            tree.Insert(8);
            tree.Insert(5);
            //tree.Insert(12);
            //tree.Insert(14);
            //tree.Insert(13);
            Console.Write("\n");
            tree.PreOrderTree(tree);
            Console.Write("\n");
            tree.InOrderTree(tree);
            Console.WriteLine(tree.Depth(tree));
            Console.WriteLine(tree.IsBanlance(tree));
            //int num =int.Parse( Console.ReadLine());
            //tree.FindPath(tree, num);
            Tree<int> flag = new Tree<int>(0);
            tree.TreePrint(tree,flag);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值