二叉樹的遍歷--C#程序舉例二叉樹的遍歷


二叉樹的遍歷--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哈哈~)自我感覺當時做的並不滿意,公司就不給大伙公開了,這是個職業素養問題,免得大伙來百度搜索,為此特意總結出這么一篇來!關於二叉樹,這里還有一篇二叉鏈表存儲的博客,喜歡可以去查看!

二叉樹的簡單介紹以及二叉樹的存儲結構

C#實現二叉樹--二叉鏈表結構


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM