C#刷剑指Offer | 二叉树中和为某一值的路径
【C#刷題】|?作者?/ Edison Zhou
這是EdisonTalk的第292篇原創(chuàng)內(nèi)容
我們來用之前學(xué)到的數(shù)據(jù)結(jié)構(gòu)知識來刷《劍指Offer》的一些核心題目(精選了其中30+道題目),希望對你有幫助!本文題目為:二叉樹中和為某一值的路徑。
1題目介紹
題目:輸入一棵二叉樹和一個整數(shù),打印出二叉樹中結(jié)點值的和為輸入整數(shù)的所有路徑。從樹的根結(jié)點開始往下一直到葉結(jié)點所經(jīng)過的結(jié)點形成一條路徑。例如輸入下圖中二叉樹和整數(shù)22,則打印出兩條路徑,第一條路徑包含結(jié)點10、12,第二條路徑包含結(jié)點10、5和7。
二叉樹結(jié)點的自定義代碼如下:
public class BinaryTreeNode {public int Data { get; set; }public BinaryTreeNode leftChild { get; set; }public BinaryTreeNode rightChild { get; set; }public BinaryTreeNode(int data){this.Data = data;}public BinaryTreeNode(int data, BinaryTreeNode left, BinaryTreeNode right){this.Data = data;this.leftChild = left;this.rightChild = right;} }2解題思路與實現(xiàn)
核心思路:
首先,通過下圖了解遍歷上圖中的二叉樹的過程:
通過上圖可以總結(jié)出規(guī)律:
(1)當用前序遍歷的方式訪問到某一結(jié)點時,我們把該結(jié)點添加到路徑上,并累加該結(jié)點的值。
(2)如果該結(jié)點為葉結(jié)點并且路徑中結(jié)點值的和剛好等于輸入的整數(shù),則當前的路徑符合要求,我們把它打印出來。如果當前結(jié)點不是葉結(jié)點,則繼續(xù)訪問它的子結(jié)點。
(3)當前結(jié)點訪問結(jié)束后,遞歸函數(shù)將自動回到它的父結(jié)點。這里要注意的是:在函數(shù)退出之前要在路徑上刪除當前結(jié)點并減去當前結(jié)點的值,以確保返回父結(jié)點時路徑剛好是從根結(jié)點到父結(jié)點的路徑。
代碼實現(xiàn):
3單元測試
測試輔助方法:
private static void TestPortal(string testName, BinaryTreeNode root, int expectedSum) {if (!string.IsNullOrEmpty(testName)){Console.WriteLine("{0} begins:", testName);}FindPath(root, expectedSum);Console.WriteLine(); }private static void SetSubTreeNode(BinaryTreeNode root, BinaryTreeNode lChild, BinaryTreeNode rChild) {if (root == null){return;}root.leftChild = lChild;root.rightChild = rChild; }private static void ClearUpTreeNode(BinaryTreeNode root) {if (root != null){BinaryTreeNode left = root.leftChild;BinaryTreeNode right = root.rightChild;root = null;ClearUpTreeNode(left);ClearUpTreeNode(right);} }單元測試用例:
// 10 // / \ // 5 12 // /\ // 4 7 // 有兩條路徑上的結(jié)點和為22 public static void Test1() {BinaryTreeNode node10 = new BinaryTreeNode(10);BinaryTreeNode node5 = new BinaryTreeNode(5);BinaryTreeNode node12 = new BinaryTreeNode(12);BinaryTreeNode node4 = new BinaryTreeNode(4);BinaryTreeNode node7 = new BinaryTreeNode(7);SetSubTreeNode(node10, node5, node12);SetSubTreeNode(node5, node4, node7);Console.WriteLine("Two paths should be found in Test1.");TestPortal("Test1", node10, 22);ClearUpTreeNode(node10); }// 10 // / \ // 5 12 // /\ // 4 7 // 沒有路徑上的結(jié)點和為15 public static void Test2() {BinaryTreeNode node10 = new BinaryTreeNode(10);BinaryTreeNode node5 = new BinaryTreeNode(5);BinaryTreeNode node12 = new BinaryTreeNode(12);BinaryTreeNode node4 = new BinaryTreeNode(4);BinaryTreeNode node7 = new BinaryTreeNode(7);SetSubTreeNode(node10, node5, node12);SetSubTreeNode(node5, node4, node7);Console.WriteLine("No paths should be found in Test2.");TestPortal("Test2", node10, 15);ClearUpTreeNode(node10); }// 5 // / // 4 // / // 3 // / // 2 // / // 1 // 有一條路徑上面的結(jié)點和為15 public static void Test3() {BinaryTreeNode node5 = new BinaryTreeNode(5);BinaryTreeNode node4 = new BinaryTreeNode(4);BinaryTreeNode node3 = new BinaryTreeNode(3);BinaryTreeNode node2 = new BinaryTreeNode(2);BinaryTreeNode node1 = new BinaryTreeNode(1);node5.leftChild = node4;node4.leftChild = node3;node3.leftChild = node2;node2.leftChild = node1;Console.WriteLine("One path should be found in Test3.");TestPortal("Test3", node5, 15);ClearUpTreeNode(node5); }// 1 // \ // 2 // \ // 3 // \ // 4 // \ // 5 // 沒有路徑上面的結(jié)點和為16 public static void Test4() {BinaryTreeNode node1 = new BinaryTreeNode(1);BinaryTreeNode node2 = new BinaryTreeNode(2);BinaryTreeNode node3 = new BinaryTreeNode(3);BinaryTreeNode node4 = new BinaryTreeNode(4);BinaryTreeNode node5 = new BinaryTreeNode(5);node1.leftChild = node2;node2.leftChild = node3;node3.leftChild = node4;node4.leftChild = node5;Console.WriteLine("No paths should be found in Test4.");TestPortal("Test4", node1, 16);ClearUpTreeNode(node1); }// 樹中只有1個結(jié)點 public static void Test5() {BinaryTreeNode node1 = new BinaryTreeNode(1);Console.WriteLine("One paths should be found in Test5.");TestPortal("Test5", node1, 1);ClearUpTreeNode(node1); }// 樹中沒有結(jié)點 public static void Test6() {Console.WriteLine("No paths should be found in Test6.");TestPortal("Test6", null, 0); }測試結(jié)果:
測試的結(jié)果情況如下圖:
Ref參考資料
何海濤,《劍指Offer》
后臺回復(fù):劍指offer,即可獲得pdf下載鏈接喲!
????掃碼關(guān)注EdisonTalk
設(shè)為星標,不再失聯(lián)!
往期推文合集:2020年上半年推文合集
成都新鮮坑位:喜鵲生活招聘.NET開發(fā)
總結(jié)
以上是生活随笔為你收集整理的C#刷剑指Offer | 二叉树中和为某一值的路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Blazor 火了,不禁让人想起已死的S
- 下一篇: C# 中 System.Range 结构