二叉树的三种遍历方式
Public class Tree { public int value; public Tree Left; public Tree Right; } class Program { public static void PreOrder(Tree Tree)//前序遍历 { int value = Tree.value; Console.WriteLine(value.ToString()); if (Tree.Left != null) PreOrder(Tree.Left); if (Tree.Right != null) PreOrder(Tree.Right); } public static void InOrder(Tree Tree) // 中序遍历 { if (Tree.Left != null) InOrder(Tree.Left); int value = Tree.value; Console.WriteLine(value.ToString()); if (Tree.Right != null) InOrder(Tree.Right); } public static void PostOrder(Tree Tree) // 后序遍历 { if (Tree.Left != null) PostOrder(Tree.Left); if (Tree.Right!= null) PostOrder(Tree.Right); int value = Tree.value; Console.WriteLine(value.ToString()); } static void Main(string[] args) { Tree Tree = new Tree(); Tree.value = 1; Tree.Left = new Tree() { value = 2, Left = new Tree() { value = 4, Right = new Tree() { value = 7 } } }; Tree.Right = new Tree() { value = 3, Left = new Tree() { value = 5 }, Right = new Tree() { value = 6, Left = new Tree() { value = 8 } } }; PreOrder(Tree); Console.WriteLine(" "); InOrder(Tree); Console.WriteLine(" "); PostOrder(Tree); Console.ReadLine(); } }
如果不是用递归,可以通过压栈来完成
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static void PreOrderNoRecursion(Tree tree) { if (tree == null) return; System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>(); Tree node = tree; while (node != null || stack.Any()) { if (node != null) { stack.Push(node); System.Console.WriteLine(node.value.ToString()); node = node.Left; } else { var item = stack.Pop(); node = item.Right; } } } public static void InOrderNoRecursion(Tree tree) { if (tree == null) return; System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>(); Tree node = tree; while (node != null || stack.Any()) { if (node != null) { stack.Push(node); node = node.Left; } else { var item = stack.Pop(); System.Console.WriteLine(item.value.ToString()); node = item.Right; } } } public static void PostOrderNoRecursion(Tree tree) { if (tree == null) return; System.Collections.Generic.Stack<Tree> stack = new System.Collections.Generic.Stack<Tree>(); Tree node = tree; Tree pre = null; stack.Push(node); while (stack.Any()) { node = stack.Peek(); if ((node.Left == null && node.Right == null) || (pre != null && (pre == node.Left || pre == node.Right))) { System.Console.WriteLine(node.value); pre = node; stack.Pop(); } else { if (node.Right != null) stack.Push(node.Right); if (node.Left != null) stack.Push(node.Left); } } }