zoukankan      html  css  js  c++  java
  • 先序中序求解二叉树(使用二叉查找树原理)

        二叉树的先序中序序列确定,二叉树也就确认了,但还原二叉树确实有点麻烦,要不断的遍历中序序列。后来学习了二叉查找树,发现了一个很巧的办法。

        二叉查找树的特性是每个节点都有权值,其规律为左子节点小于父节点,右子节点大于父节点,其中序序列是有序的。如果我们把二叉树变成二叉查找树,就是要给每个子节点赋值,最简单的根据中序序列从0->赋值,现在我们来看看二叉查找树先序序列和二叉查找树的关系。以下树的中序序列为DBEGACF,附上权值为(D:0,B:1,E:2,G:3,A:4,C:5,F:6 )

      关于这个2插树先序为ABDEGCF,先序序列是先本身节点->左节点->有节点。细心发现二叉查找树的先序序列可以作为节点进入树的先后顺序(节点进入树的先后顺序可以有多个,不一定是先序序列),根据中序的赋值先序可以为4102356(与ABDEGCF相对应)也就是用这个序列来创建二叉查找树。接下来就不用我多说了。附上C#实现代码(PS:写算法不要用C#,坑)

      1 namespace Test
      2 {
      3     class Program
      4     {
      5         static void Main(string[] args)
      6         {
      7             string first = "ABDEGCF";           //先序
      8             string mid = "DBEGACF";             //中序
      9             DouBleTree doubletree = new DouBleTree(first,mid);
     10             Console.WriteLine(doubletree.FirstOrder());     //先序
     11             Console.WriteLine(doubletree.MidOrder());       //中序
     12             Console.WriteLine(doubletree.AfterOrder());     //后序
     13             Console.ReadLine();
     14         }
     15     }
     16     public class DouBleTree
     17     {
     18         /// <summary>
     19         /// 
     20         /// </summary>
     21         /// <param name="first">先序</param>
     22         /// <param name="mid">中序</param>
     23         public DouBleTree(string first, string mid)
     24         {
     25             tlist = new List<T>();
     26             for (int i = 0; i < mid.Length; i++)        //  附加权值
     27             {
     28                 T t = new T
     29                 {
     30                     data = mid[i],
     31                     WeigthValue = i,
     32                 };
     33                 tlist.Add(t);
     34             }
     35             doubleTreeRoot = new DoubleTreePoint        //创建根节点
     36             {
     37                 data = first[0],
     38                 WeightValue = tlist.FirstOrDefault(n => n.data == first[0]).WeigthValue,
     39             };
     40             for (int i = 1; i < first.Length; i++)      //创建二叉树
     41             {
     42                 T t = tlist.FirstOrDefault(n => n.data == first[i]);
     43                 doubleTreeRoot = InsertPoint(doubleTreeRoot, t);
     44             }
     45         }
     46         private DoubleTreePoint doubleTreeRoot;                                     //二叉树根节点
     47         private List<T> tlist;                                                      //给中序队列附权值
     48         private DoubleTreePoint InsertPoint(DoubleTreePoint point  ,T t)            //插入节点
     49         {
     50             if (point == null)
     51             {
     52                 point = new DoubleTreePoint
     53                 {
     54                     data = t.data,
     55                     WeightValue = t.WeigthValue,
     56                 };
     57                 return point;
     58             }
     59             if (point.WeightValue > t.WeigthValue)
     60             {
     61                  point.left = InsertPoint(point.left, t);
     62             }
     63             else
     64             {
     65                  point.right = InsertPoint(point.right, t);
     66             }
     67             return point;
     68 
     69         }
     70         public string FirstOrder()                      //返回先序队列
     71         {
     72             string str = "";
     73             First(doubleTreeRoot,ref str);
     74             return str;
     75         }
     76         private void First(DoubleTreePoint doubleTreePoint,ref string str)
     77         {
     78             if (doubleTreePoint == null) return;
     79             str += doubleTreePoint.data;
     80             First(doubleTreePoint.left,ref str);
     81             First(doubleTreePoint.right,ref str);
     82         }
     83         public string MidOrder()
     84         {
     85             string str = "";
     86             Mid(doubleTreeRoot, ref str);
     87             return str;
     88         }
     89         private void Mid(DoubleTreePoint doubleTreePoint,ref string str)
     90         {
     91             if (doubleTreePoint == null) return;
     92             Mid(doubleTreePoint.left,ref str);
     93             str += doubleTreePoint.data;
     94             Mid(doubleTreePoint.right,ref str);
     95         }
     96         public string AfterOrder()
     97         {
     98             string str = "";
     99             After(doubleTreeRoot,ref str);
    100             return str;
    101         }
    102         private void After(DoubleTreePoint doubleTreePoint,ref string str)
    103         {
    104             if (doubleTreePoint == null) return;
    105             After(doubleTreePoint.left,ref str);
    106             After(doubleTreePoint.right,ref str);
    107             str += doubleTreePoint.data;
    108         }
    109     }
    110     public class DoubleTreePoint
    111     {
    112         public char data { get; set; }          //数据
    113         public DoubleTreePoint left { get; set; }
    114         public DoubleTreePoint right { get; set; }
    115         public int WeightValue { get; set; }    //权值
    116     }
    117     public class T
    118     {
    119         public char data { get; set; }
    120         public int WeigthValue { get; set; } 
    121     }
    122 }
    View Code

      

  • 相关阅读:
    jira:7.12.3版本搭建(破解版)
    traefik添加多证书
    人肉分析sorted(lst, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.islower(), x.isupper(), x))过程
    jquery实现checkbox全选/反选/取消
    k8s简单集群搭建
    第十二周编程总结
    第十周作业
    第九周编程总结
    第七周编程总结
    第五周编程总结
  • 原文地址:https://www.cnblogs.com/linxingxunyan/p/5793484.html
Copyright © 2011-2022 走看看