• 面试题:二叉树的遍历


    1.定义队列用到的Node类:

     1   class Node<T>
     2     {
     3         T Val;
     4         Node<T> Next;
     5         public Node() { }
     6         public Node(T val)
     7         {
     8             Val = val;
     9             this.Next = null;
    10         }
    11         public T Value
    12         {
    13             get { return Val; }
    14             set { Val = value; }
    15         }
    16         public Node<T> NextNode
    17         {
    18             get { return Next; }
    19             set { Next = value; }
    20         }
    21     }
    View Code

    2.定义Queue类:

     1     class Queue<T> 
     2     {
     3         T Val;  //节点值
     4         Node<T> First;
     5         Node<T> Last;
     6         public T Value
     7         {
     8             get { return Val; }
     9             set { Val = value; }
    10         }
    11         public Node<T> FirstNode
    12         {
    13             get { return First; }
    14             set { First = value; }
    15         }
    16         public Node<T> LastNode
    17         {
    18             get { return Last; }
    19             set { Last = value; }
    20         }
    21         public Queue() { }
    22         public Queue(Node<T> Head)
    23         {
    24             FirstNode = Head;
    25         }
    26         public Queue(Node<T> Head, Node<T> End)
    27         {
    28             FirstNode = Head;
    29             LastNode = End;
    30         }
    31         public Node<T> Push(T Value)
    32         {
    33             Node<T> temp = new Node<T>(Value);
    34             if (FirstNode == null)
    35             {
    36                 temp.NextNode = null;
    37                 FirstNode = temp;
    38                 LastNode = temp;
    39             }
    40             else if (FirstNode == LastNode)
    41             {
    42                 LastNode = temp;
    43                 FirstNode.NextNode = LastNode;
    44             }
    45             else
    46             {
    47                 LastNode.NextNode = temp;
    48                 LastNode = temp;
    49             }
    50             return FirstNode;
    51         }
    52         public Node<T> Pop(ref Queue<T> que)
    53         {
    54             if (que.FirstNode == null) return null;
    55             Node<T> temp = que.FirstNode;
    56             if (que.FirstNode == que.LastNode)
    57             {
    58                 que.FirstNode = null;
    59                 que.LastNode = null;
    60             }
    61             else
    62             {
    63                 que.FirstNode = que.FirstNode.NextNode;
    64                 temp.NextNode = null;
    65             }
    66             return temp;
    67         }
    68     }
    View Code

    3.定义Stack类:

     1     class Stack<T>
     2     {
     3         Node<T> Head;
     4         public Node<T> HeadNode
     5         {
     6             get{ return Head; }
     7             set { Head = value; }
     8         }
     9         public Stack() { }
    10         public Stack(Node<T> node)
    11         {
    12             if (node != null)
    13             {
    14                 HeadNode = node;
    15             }
    16         }
    17         public Node<T> Pop()
    18         {
    19             if (HeadNode == null)
    20             {
    21                 return null;
    22             }
    23             else
    24             {
    25                 Node<T> temp = HeadNode;
    26                 Node<T> outNode = HeadNode;
    27                 if (temp.NextNode == null)
    28                 {
    29                     HeadNode = null;
    30                     return temp;
    31                 }
    32                 else
    33                 {
    34                     while (temp != null)
    35                     {
    36                         if (temp.NextNode != null && temp.NextNode.NextNode == null)
    37                         {
    38                             outNode = temp.NextNode;
    39                             temp.NextNode = null;
    40                             break;
    41                         }
    42                         temp = temp.NextNode;
    43                     }
    44                     return outNode;
    45                 }
    46             }
    47         }
    48         public Node<T> Push(Node<T> node)
    49         {
    50             if (HeadNode == null)
    51             {
    52                 HeadNode = node;
    53             }
    54             else
    55             {
    56                 Node<T> temp = HeadNode;
    57                 while (temp != null)
    58                 {
    59                     if (temp.NextNode == null)
    60                     {
    61                         temp.NextNode = node;
    62                         break;
    63                     }
    64                     temp = temp.NextNode;
    65                 }
    66             }
    67             return HeadNode;
    68         }
    69     }
    View Code

    4.定义TreeNode类:

     1     class TreeNode<T>
     2     {
     3         T Val;  //节点值
     4         TreeNode<T> Left;  //左子节点
     5         TreeNode<T> Right; //右子节点
     6         TreeNode<T> Parent;//父节点
     7         public TreeNode() { }
     8         public TreeNode(T value)
     9         {
    10             Val = value;           
    11         }
    12         public T Value
    13         {
    14             get { return Val; }
    15             set { Val = value; }
    16         }
    17         public TreeNode<T> LeftNode
    18         {
    19             get { return Left; }
    20             set { Left = value; }
    21         }
    22         public TreeNode<T> RightNode
    23         {
    24             get { return Right; }
    25             set { Right = value; }
    26         }
    27         public TreeNode<T> ParentNode
    28         {
    29             get { return Parent; }
    30             set { Parent = value; }
    31         }
    32 
    33         /// <summary>
    34         /// 建立树节点之间的关系
    35         /// </summary>
    36         /// <param name="nodeA"></param>
    37         /// <param name="nodeB"></param>
    38         /// <param name="nodeC"></param>
    39         public void setNodeInfo(TreeNode<T> nodeA, TreeNode<T> nodeB, TreeNode<T> nodeC)
    40         {
    41             this.ParentNode = nodeA;
    42             this.LeftNode = nodeB;
    43             this.RightNode = nodeC;
    44         }
    45 }
    View Code

    5.在TreeNode类中添加遍历TreeNode的方法:

    1)先根遍历

     1         /// <summary>
     2         /// 先根遍历
     3         /// </summary>
     4         /// <param name="root"></param>
     5         public void Traverse_RootFirst(TreeNode<T> root)
     6         {
     7             if (root != null)
     8             {
     9                 Console.Write(root.Val+"	");
    10                 Traverse_RootFirst(root.LeftNode);
    11                 Traverse_RootFirst(root.RightNode);
    12             }
    13         }

    2)中根遍历

     1         /// <summary>
     2         /// 中根遍历
     3         /// </summary>
     4         /// <param name="root"></param>
     5         public void Traverse_LeftFirst(TreeNode<T> root)
     6         {
     7             if (root != null)
     8             {
     9                 Traverse_LeftFirst(root.LeftNode);
    10                 Console.Write(root.Val + "	");
    11                 Traverse_LeftFirst(root.RightNode);
    12             }
    13         }

    3)后根遍历

     1         /// <summary>
     2         /// 后根遍历
     3         /// </summary>
     4         /// <param name="root"></param>
     5         public void Traverse_RightFirst(TreeNode<T> root)
     6         {
     7             if (root != null)
     8             {
     9                 Traverse_RightFirst(root.LeftNode);
    10                 Traverse_RightFirst(root.RightNode);
    11                 Console.Write(root.Val + "	");
    12             }
    13         }

    4)层次遍历

     1         /// <summary>
     2         /// 层次遍历
     3         /// </summary>
     4         /// <param name="root"></param>
     5         public void LevelTraverse(TreeNode<T> root)
     6         {
     7             if (root != null)
     8             {
     9                 Queue<TreeNode<T>> que1 = new Queue<TreeNode<T>>();
    10                 Queue<TreeNode<T>> que2 = new Queue<TreeNode<T>>();
    11                 que1.Push(root);
    12                 while (que1 != null)
    13                 {                    
    14                     TreeNode<T> temp = new TreeNode<T>();
    15                     while (que1.FirstNode != null)
    16                     {
    17                         Console.Write(que1.FirstNode.Value.Value + "	");
    18                         temp = que1.FirstNode.Value;
    19                         if (temp.LeftNode != null)
    20                         {
    21                             que2.Push(temp.LeftNode);
    22                         }
    23                         if (temp.RightNode != null)
    24                         {
    25                             que2.Push(temp.RightNode);
    26                         }
    27                         que1.Pop(ref que1);
    28                     }
    29                     while (que2.FirstNode != null)
    30                     {
    31                         Console.Write(que2.FirstNode.Value.Value + "	");
    32                         temp = que2.FirstNode.Value;
    33                         if (temp.Left != null)
    34                         {
    35                             que1.Push(temp.Left);
    36                         }
    37                         if (temp.Right != null)
    38                         {
    39                             que1.Push(temp.Right);
    40                         }
    41                         que2.Pop(ref que2);
    42                     }                
    43                 }
    44             }
    45         }

    5)蛇形遍历

     1         /// <summary>
     2         /// 蛇形遍历
     3         /// </summary>
     4         /// <param name="root"></param>
     5         public void SerpentineLevelTraverse(TreeNode<T> root)
     6         {
     7             if (root != null)
     8             {
     9                 Queue<TreeNode<T>> que = new Queue<TreeNode<T>>();
    10                 Stack<TreeNode<T>> st = new Stack<TreeNode<T>>();
    11                 int time = 1;//设置一个变量判断是否为奇数行
    12                 que.Push(root);
    13                 while (que.FirstNode != null)
    14                 {
    15                     TreeNode<T> temp = new TreeNode<T>();
    16                     while (que.FirstNode != null)
    17                     {
    18                         temp = que.FirstNode.Value;
    19                         Console.Write(temp.Value + "	");
    20                         if (time % 2 == 1)//如果是奇数行,栈内先入左子节点,如果是偶数行,栈内先入右子节点
    21                         {
    22                             if (temp.LeftNode != null)
    23                             {
    24                                 st.Push(new Node<TreeNode<T>>(temp.LeftNode));
    25                             }
    26                             if (temp.RightNode != null)
    27                             {
    28                                 st.Push(new Node<TreeNode<T>>(temp.RightNode));
    29                             }
    30                         }
    31                         else
    32                         {
    33                             if (temp.RightNode != null)
    34                             {
    35                                 st.Push(new Node<TreeNode<T>>(temp.RightNode));
    36                             }
    37                             if (temp.LeftNode != null)
    38                             {
    39                                 st.Push(new Node<TreeNode<T>>(temp.LeftNode));
    40                             }
    41                         }
    42                         que.Pop(ref que);
    43                     }
    44                     time++;
    45                     while (st.HeadNode != null)
    46                     {
    47                         temp = st.Pop().Value;
    48                         que.Push(temp);
    49                     }
    50                 }
    51             }
    52         }

     主函数:

     1 static void Main(string[] args)
     2         {
     3             TreeNode<string> nodeA = new TreeNode<string>("A");
     4             TreeNode<string> nodeB = new TreeNode<string>("B");
     5             TreeNode<string> nodeC = new TreeNode<string>("C");
     6             TreeNode<string> nodeD = new TreeNode<string>("D");
     7             TreeNode<string> nodeE = new TreeNode<string>("E");
     8             TreeNode<string> nodeF = new TreeNode<string>("F");
     9             TreeNode<string> nodeG = new TreeNode<string>("G");
    10             TreeNode<string> nodeH = new TreeNode<string>("H");
    11             TreeNode<string> nodeI = new TreeNode<string>("I");
    12             TreeNode<string> nodeJ = new TreeNode<string>("J");
    13             TreeNode<string> nodeK = new TreeNode<string>("K");
    14             nodeA.setNodeInfo(null, nodeB, nodeC);
    15             nodeB.setNodeInfo(nodeA, nodeD, nodeE);
    16             nodeC.setNodeInfo(nodeA, nodeF, nodeG);
    17             nodeD.setNodeInfo(nodeB, null, nodeH);
    18             nodeE.setNodeInfo(nodeB, nodeI, nodeJ);
    19             nodeF.setNodeInfo(nodeC, null, null);
    20             nodeH.setNodeInfo(nodeD, null, nodeK);
    21             //nodeA.LevelTraverse(nodeA);
    22             nodeA.SerpentineLevelTraverse(nodeA);
    23             Console.ReadKey();
    24         }

     

    蛇形遍历的输出结果:

  • 相关阅读:
    条件注释,判断浏览器版本
    IE 兼容模式下不支持DIV CSS样式display:inline-block,解决
    Hibernate配置问题
    初学Hibernate
    Ognl基本使用
    初学Struts2-自定义拦截器及其配置
    初学structs2,表单验证简单补充
    初学structs2,表单验证
    structs2标签简单实用,及自定义转换器示例代码
    一些专业术语的总结
  • 原文地址:https://www.cnblogs.com/hehe625/p/7803855.html
Copyright © 2020-2023  润新知