标签:
项目源码及其他声明等参见数据结构(一)线性结构篇。
树作为一种应用广泛的一对多非线性数据结构,不仅有数据间的指向关系,还有层级关系,示例见图一。因树的结构比较复杂,为了简化操作及存储,我们一般将树转换为二叉树处理,因此本文主要讨论二叉树。
加线,所有兄弟结点之间加一条连线。
抹线,对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线。
整理,整理前两步得到的树,使之结构层次分明。
加线,若某结点的左孩子结点存在,将左孩子结点的右孩子结点、右孩子结点的右孩子结点……都作为该结点的孩子结点,将该结点与这些右孩子结点用线连接起来。
抹线,删除原二叉树中所有结点与其右孩子结点的连线。
整理,整理前两步得到的树,使之结构层次分明。
1 /// <summary> 2 /// 先序遍历(DLR) 3 /// </summary> 4 /// <![CDATA[首先访问跟节点,然后遍历左子树,最后右子树]]> 5 static void PreOrder(Node<char> root) 6 { 7 if (root == null) 8 { 9 return; 10 } 11 12 Print(root); 13 PreOrder(root.LChild); 14 PreOrder(root.RChild); 15 } 16 17 /// <summary> 18 /// 中序遍历(LDR) 19 /// </summary> 20 /// <![CDATA[先遍历左子树,然后根节点,最后遍历右子树]]> 21 static void InOrder(Node<char> root) 22 { 23 if (root == null) 24 { 25 return; 26 } 27 28 InOrder(root.LChild); 29 Print(root); 30 InOrder(root.RChild); 31 } 32 33 /// <summary> 34 /// 后序遍历(LRD) 35 /// </summary> 36 /// <![CDATA[先遍历左子树,然后遍历右子树,最后遍历根节点]]> 37 static void PostOrder(Node<char> root) 38 { 39 if (root == null) 40 { 41 return; 42 } 43 44 PostOrder(root.LChild); 45 PostOrder(root.RChild); 46 Print(root); 47 } 48 49 /// <summary> 50 /// 层序遍历 51 /// </summary> 52 /// <![CDATA[从上向下从左到右]]> 53 static void LevelOrder(Node<char> root) 54 { 55 if (root == null) 56 { 57 return; 58 } 59 CSeqQueue<Node<char>> sq = new CSeqQueue<Node<char>>(50); 60 sq.In(root); 61 while (!sq.IsEmpty()) 62 { 63 Node<char> tmp = sq.Out(); 64 Print(tmp); 65 66 if (tmp.LChild != null) 67 { 68 sq.In(tmp.LChild); 69 } 70 71 if (tmp.RChild != null) 72 { 73 sq.In(tmp.RChild); 74 } 75 } 76 }
标签:
原文地址:http://www.cnblogs.com/kai364/p/5764657.html