//=======================三目运算符弄一下============================== public List <String> Test4(String LaTeX) { //开始层次遍历 List <String> list = new List <String>(); BinaryTreeNode bnode = new BinaryTreeNode(); FinalNode1 root = new FinalNode1(); FinalNode1 tempNode = new FinalNode1(); root = bnode.getNode(LaTeX); //Console.WriteLine("来看看第一个节点:" + root.zifu); root.xuhao = 1; tempNode = root;//临时指向根结点 Queue <FinalNode1> q = new Queue <FinalNode1>(); q.Enqueue(root); //Console.WriteLine("下一个来看看第一个节点:" + q.First().zifu); while (q.Count != 0) { //指向队列第一个字符 tempNode = q.First(); //Console.WriteLine("什么鬼啊下下一个来看看第一个节点:" + tempNode.zifu); //下面这个再加个判断就行了就是if(tempNode.left == null && tempNode.right == null),tempNode就是出队节点 //=======!!!!!!!!!!!!!!这里注意:因为有根号的了,所以不能直接判断左右为空,而我根号默认是左节点!!!!!!!!!!!!!!!!! //第一种情况是:可交换运算符且左右都不空 if ((tempNode.left != null && tempNode.right != null && JiaoHuanOperator(tempNode.zifu))) { String strs1 = ""; String strs2 = ""; strs1 = Test5(tempNode.left) + tempNode.left.Flag + tempNode.zifu + tempNode.Flag + "#" + tempNode.zifu + tempNode.Flag + Test5(tempNode.right) + tempNode.right.Flag;// strs2 = Test5(tempNode.right) + tempNode.right.Flag + tempNode.zifu + tempNode.Flag + "#" + tempNode.zifu + tempNode.Flag + Test5(tempNode.left) + tempNode.left.Flag; list.Add(strs1); list.Add(strs2); //Console.WriteLine("第一种情况:" + tempNode.zifu); //Console.WriteLine("============第一种情况================="); } //第二种情况是:不可交换运算符且左右都不空,类似减号 if ((tempNode.left != null && tempNode.right != null && !JiaoHuanOperator(tempNode.zifu))) { String strs1 = ""; strs1 = Test5(tempNode.left) + tempNode.left.Flag + tempNode.zifu + tempNode.Flag + "#" + tempNode.zifu + tempNode.Flag + Test5(tempNode.right) + tempNode.right.Flag;// list.Add(strs1); //Console.WriteLine("============第二种情况================="); //Console.WriteLine("第二种情况:" + tempNode.zifu); } //第三种情况:类似根号形式的 if ((tempNode.left != null && tempNode.right == null && !JiaoHuanOperator(tempNode.zifu))) { String strs1 = ""; strs1 = tempNode.zifu + tempNode.Flag + "#" + Test5(tempNode.left) + tempNode.left.Flag;// "+","左节点" list.Add(strs1); //Console.WriteLine("这里应该是根号:" + tempNode.zifu); //Console.WriteLine("============第三种情况================="); } //第一个节点出队 q.Dequeue(); if (tempNode.left != null) { //tempNode.left.xuhao = tempNode.xuhao * 2; //Console.WriteLine("++++++++++++++left" + tempNode.left.xuhao); q.Enqueue(tempNode.left); } if (tempNode.right != null) { //tempNode.right.xuhao = tempNode.xuhao * 2 + 1; //Console.WriteLine("++++++++++++++" + tempNode.right.xuhao); q.Enqueue(tempNode.right); } } return(list); }
////我把第一篇论文的实验数据的子式写入数据库吧 //public void Test3() //{ // // LaTeX,子式节点 // Dictionary<AAAAData, List<String>> dic = new Dictionary<AAAAData, List<String>>(); // StreamReader sr = new StreamReader("C:\\Users\\dell\\Desktop\\暑假\\实验数据\\1.txt", Encoding.Default); // String read = sr.ReadLine(); // //第一步:开始读取每一个数学表达式了啊 // while (read != null) // { // //第二步:直接构成倒排索引吧,省的以后要是有重复的数学表达式啥的 // //对于输入进来的每一个数学公式,把它解析为各个子式 // List<AAAAData> li = new List<AAAAData>(); // li = Test4(read); // int biaozhi = 0;//每进来一个子式,就记作一个标志 // //对于每一个子式节点,我需要插入字典,作为倒排索引 // foreach (var it in li) // { // //if (dic.Count == 0) // //{ // // List<String> list = new List<string>(); // // list.Add(read); // // dic.Add(it,list); // // Console.WriteLine("第一个if"); // //} // //else // //{ // // //我去遍历字典的键值对象 // // foreach (var zidian in dic) // // { // // //如果字典里面的倒排索引有某一个子式了 // // if (zidian.Key.Equals(it) && (biaozhi == 0)) // // { // // Console.WriteLine("第二个if"); // // dic[zidian.Key].Add(read); // // biaozhi++; // // } // // else if(!zidian.Key.Equals(it)) // // { // // List<String> list = new List<string>(); // // list.Add(read); // // dic.Add(it, list); // // } // // } // //} // //========================================================== // if (dic.Count == 0) // { // List<String> list = new List<string>(); // list.Add(read); // dic.Add(it, list); // continue; // } // int a = 0;//这是个判断标志,下面开始遍历,如果找到,那么a=1,没找到a=0 // AAAAData tempKey = null;//定义临时键存储文件名字 // foreach (var item in dic) // { // if (item.Key.Equals(it)) // { // a = 1; // tempKey = item.Key;//其实不用定义,因为如果找到,indexes.FileName与item.Key相等,下面那个“[]中括号”找谁不都一样么,多此一举 // break;//一旦找到说明找到了,那么就可以终止了,此时等于一加个break,否则又出bug了 // } // } // if (a == 1)//说明找到了 // { // dic[tempKey].Add(read); // } // else if (a == 0)//说明没找到 // { // List<String> list = new List<string>(); // list.Add(read); // dic.Add(it, list); // } // //========================================================== // }//循环里面 // read = sr.ReadLine(); // } // ////这里把数据倒排插入数据库 // //bool panduan; // //string sqlstr = "insert into Test1(子式,子式所在高度,数学表达式) values ('" + node + "','" + filename + "','" + path + "')"; // //panduan = DBhelper.InsertUpdateDal(sqlstr); // //if (panduan == true) // //{ // // Console.Write("操作成功"); // //} // //else // //{ // // Console.Write("操作失败"); // //} //} //我先试一试获取数学表达式子式 public List <AAAAData> Test4(String LaTeX) { //开始层次遍历 List <AAAAData> list = new List <AAAAData>(); BinaryTreeNode bnode = new BinaryTreeNode(); FinalNode1 root = new FinalNode1(); FinalNode1 tempNode = new FinalNode1(); root = bnode.getNode(LaTeX); //Console.WriteLine("来看看第一个节点:" + root.zifu); root.xuhao = 1; tempNode = root;//临时指向根结点 Queue <FinalNode1> q = new Queue <FinalNode1>(); q.Enqueue(root); //Console.WriteLine("下一个来看看第一个节点:" + q.First().zifu); while (q.Count != 0) { //指向队列第一个字符 tempNode = q.First(); //Console.WriteLine("什么鬼啊下下一个来看看第一个节点:" + tempNode.zifu); //下面这个再加个判断就行了就是if(tempNode.left == null && tempNode.right == null),tempNode就是出队节点 //=======!!!!!!!!!!!!!!这里注意:因为有根号的了,所以不能直接判断左右为空,而我根号默认是左节点!!!!!!!!!!!!!!!!! if ((tempNode.left != null && tempNode.right != null) || (tempNode.left != null && tempNode.right == null)) { AAAAData data = new AAAAData(); data.BTLevel = tempNode.BTreeLevel; data.str = Test5(tempNode); list.Add(data); //Console.WriteLine("这里应该是根号:" + tempNode.zifu); } //第一个节点出队 q.Dequeue(); if (tempNode.left != null) { tempNode.left.xuhao = tempNode.xuhao * 2; //Console.WriteLine("++++++++++++++left" + tempNode.left.xuhao); q.Enqueue(tempNode.left); } if (tempNode.right != null) { tempNode.right.xuhao = tempNode.xuhao * 2 + 1; //Console.WriteLine("++++++++++++++" + tempNode.right.xuhao); q.Enqueue(tempNode.right); } } return(list); }
//重新写结构 public void WriteStructure() { StreamReader sr = new StreamReader("C:\\Users\\dell\\Desktop\\暑假\\实验数据\\1.txt", Encoding.Default); StreamWriter sw = new StreamWriter("C:\\Users\\dell\\Desktop\\暑假\\实验数据\\2.txt"); String read = sr.ReadLine(); while (read != null) { //开始层次遍历 Dictionary <int, List <String> > dic = new Dictionary <int, List <string> >(); BinaryTreeNode bnode = new BinaryTreeNode(); FinalNode1 root = new FinalNode1(); FinalNode1 tempNode = new FinalNode1(); root = bnode.getNode(read); root.xuhao = 1; tempNode = root;//临时指向根结点 Queue <FinalNode1> q = new Queue <FinalNode1>(); q.Enqueue(root); while (q.Count != 0) { //指向队列第一个字符 tempNode = q.First(); if (dic.Count == 0) { List <String> list = new List <string>(); list.Add(tempNode.zifu + "1" + "1"); dic.Add(tempNode.BTreeLevel, list); } else { if (dic.ContainsKey(tempNode.BTreeLevel)) { if (isOperator(tempNode.zifu)) { dic[tempNode.BTreeLevel].Add(tempNode.zifu + tempNode.BTreeLevel + tempNode.xuhao); } else { dic[tempNode.BTreeLevel].Add("$" + tempNode.BTreeLevel + tempNode.xuhao); } } else { if (isOperator(tempNode.zifu)) { List <String> list = new List <string>(); list.Add(tempNode.zifu + tempNode.BTreeLevel + tempNode.xuhao); dic.Add(tempNode.BTreeLevel, list); } else { List <String> list = new List <string>(); list.Add("$" + tempNode.BTreeLevel + tempNode.xuhao); dic.Add(tempNode.BTreeLevel, list); } } } //第一个节点出队 q.Dequeue(); if (tempNode.left != null) { tempNode.left.xuhao = tempNode.xuhao * 2; //Console.WriteLine("++++++++++++++left" + tempNode.left.xuhao); q.Enqueue(tempNode.left); } if (tempNode.right != null) { tempNode.right.xuhao = tempNode.xuhao * 2 + 1; //Console.WriteLine("++++++++++++++" + tempNode.right.xuhao); q.Enqueue(tempNode.right); } } //开始写了 String str = null; foreach (var it in dic) { String text = ""; foreach (var itt in it.Value) { text = text + itt; } str = str + text + "#"; } str = str + read; Console.WriteLine("结果为:" + str); sw.WriteLine(str); read = sr.ReadLine(); }//读取内容 sw.Flush(); }