二叉樹的遍歷--C#程序舉例二叉樹的遍歷
關於二叉樹的介紹笨男孩前面寫過一篇博客
二叉樹的簡單介紹以及二叉樹的存儲結構
遍歷方案
二叉樹的遍歷分為以下三種:
先序遍歷:遍歷順序規則為【根左右】
中序遍歷:遍歷順序規則為【左根右】
后序遍歷:遍歷順序規則為【左右根】
舉例說明如下圖是一個顆二叉樹:

圖1一棵二叉樹
上圖是一顆二叉樹:
先序遍歷(根左右):ABCDEFGHI
中序遍歷(左根右):BDCAEHGIF
后序遍歷(左右根):DCBHIGFEA
C#代碼舉例
一棵簡單的二叉樹結構
1 public class BinaryTree 2 { 3 public string Value; 4 public BinaryTree lChild; 5 public BinaryTree rChild; 6 }
先序遍歷
1 //先序遍歷-遞歸實現 //根左右 2 public static void PreorderTraversal(BinaryTree tree) 3 { 4 if (tree == null) 5 return; 6 System.Console.WriteLine(tree.Value); 7 PreorderTraversal(tree.lChild); 8 PreorderTraversal(tree.rChild); 9 }
中序遍歷
1 //中序遍歷-遞歸實現 //左根右 2 public static void InorderTraversal(BinaryTree tree) 3 { 4 if (tree == null) 5 return; 6 7 InorderTraversal(tree.lChild); 8 System.Console.WriteLine(tree.Value); 9 InorderTraversal(tree.rChild); 10 }
后序遍歷
1 //后序遍歷-遞歸實現 //左右根 2 public static void PostorderTraversal(BinaryTree tree) 3 { 4 if (tree == null) 5 return; 6 7 PostorderTraversal(tree.lChild); 8 PostorderTraversal(tree.rChild); 9 System.Console.WriteLine(tree.Value); 10 }
程序測試
創建一棵如下圖所示的二叉樹

1 /// <summary> 2 /// 創建一顆二叉樹 3 /// </summary> 4 /// <returns></returns> 5 public static BinaryTree CreatBinaryTree() 6 { 7 //創建一個tree 8 BinaryTree tree = new BinaryTree(); 9 10 //添加二叉樹的值 11 tree.Value = "A"; 12 13 //添加該樹左子樹 14 tree.lChild = new BinaryTree() 15 { 16 Value = "B", 17 lChild = null, 18 rChild = new BinaryTree() 19 { 20 Value = "C", 21 lChild = new BinaryTree() 22 { 23 Value = "D", 24 }, 25 rChild = null, 26 } 27 }; 28 29 //添加該樹右子樹 30 tree.rChild = new BinaryTree() 31 { 32 Value = "E", 33 lChild = null, 34 rChild = new BinaryTree() 35 { 36 Value = "F", 37 lChild = new BinaryTree() 38 { 39 Value = "G", 40 lChild = new BinaryTree() 41 { 42 Value = "H", 43 lChild = null, 44 rChild = null 45 }, 46 rChild = new BinaryTree() 47 { 48 Value = "I", 49 lChild = null, 50 rChild = null 51 52 } 53 }, 54 rChild = null 55 } 56 57 }; 58 return tree; 59 }
測試代碼
1 static void Main(string[] args) 2 { 3 BinaryTree tree = CreatBinaryTree(); 4 5 Console.WriteLine("------------先序遍歷------------"); 6 PreorderTraversal(tree); 7 8 Console.WriteLine("------------中序遍歷------------"); 9 InorderTraversal(tree); 10 Console.WriteLine("------------后序遍歷------------"); 11 PostorderTraversal(tree); 12 13 Console.Read(); 14 }
測試結果:

有了上面的知識儲備,那么涉及到二叉樹的問題,那基本就有點普了,下面看一道試題(面試的題,具體是哪個公司就不說了,免得大伙百度搜索)
試題:找出一顆二叉樹中是否存在值與某一個值的相等的元素 (記憶里大概是這個意思)
這就很簡單了,實際上就考一個二叉樹的遍歷,這里寫一個先序遍歷查找的例子
查找節點函數
1 /// <summary> 2 /// 先序遍歷查找二叉樹中是否存在某一個值,並返回該元素 3 /// </summary> 4 /// <param name="tree"></param> 5 /// <param name="value"></param> 6 /// <returns></returns> 7 public static BinaryTree PreorderTraversalSelectValue(BinaryTree tree, string value) 8 { 9 if (tree == null) 10 { 11 return null; 12 } 13 if (tree.Value == value) 14 { 15 return tree; 16 } 17 //找左子樹 18 BinaryTree node = PreorderTraversalSelectValue(tree.lChild,value); 19 if (node != null) 20 { 21 return tree; 22 } 23 else 24 { 25 //找右子樹 26 node = PreorderTraversalSelectValue(tree.rChild,value); 27 return node; 28 } 29 }
測試代碼:
1 BinaryTree tree2 = PreorderTraversalSelectValue(tree,"F"); 2 if (tree2 == null) 3 { 4 Console.WriteLine("該二叉樹中不存在F"); 5 } 6 else 7 { 8 Console.WriteLine("該二叉樹中存在值為{0}的元素",tree2.Value); 9 } 10 BinaryTree tree3 = PreorderTraversalSelectValue(tree, "J"); 11 if (tree3 == null) 12 { 13 Console.WriteLine("該二叉樹中不存該元素J"); 14 } 15 else 16 { 17 Console.WriteLine("該二叉樹中存在值為{0}的元素", tree3.Value); 18 }
程序運行結果:

有需要源代碼工程的可以自己下載
程序源代碼工程下載
以上是一個面試經歷,面試官給的試題,當時我記得用先序遍歷做的,用筆寫(確實和用VS寫感覺是不一樣的,O(∩_∩)O哈哈~)自我感覺當時做的並不滿意,公司就不給大伙公開了,這是個職業素養問題,免得大伙來百度搜索,為此特意總結出這么一篇來!關於二叉樹,這里還有一篇二叉鏈表存儲的博客,喜歡可以去查看!
