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