1. 程式人生 > >在二叉樹中找出和為某一值的所有路徑-java實現

在二叉樹中找出和為某一值的所有路徑-java實現

一個小演算法,分享一下思路:

描述:

寫一個程式建立一棵二叉樹,並按照一定規則,輸出二叉樹根節點到葉子節點的路徑。

規則如下:
1、從最頂端的根結點,到最下面的葉子節點,計算路徑通過的所有節點的和,如果與設定的某一值的相同,那麼輸出這條路徑上的所有節點。

2、從根節點遍歷樹時,請請按照左到右遍歷,即優先訪問左子樹的節點。


二叉樹建立規則:從上到下一層一層的,按照從左到右的順序進行構造

輸入"10,5,12,4,7"值,構造的樹如下:

1)    10


2)    10
       /
      5
      
3)    10
       /\
      5  12
 
4)    10
       /\
      5  12 
     /
    4     
      
5)    10
       /\
      5  12 
     /\
    4  7

針對上面的二叉樹,如果當前我們設定的“路徑和”為19,那麼輸出結果為:

10,5,4

如果有多個路徑,按到左到右的順序遍歷生成的結果每行顯示一個顯示。例如如果當前我們設定的“路徑和”為22,那麼輸出結果為:

10,5,7

10,12

如果沒有找到路徑和為設定的值的路徑,輸出error。


輸入:

輸入整數N---路徑和

一行字串,多個正整數,之間用","隔開


輸出:

滿足條件的二叉樹路徑

輸入:

22
10,5,12,4,7

樣例輸出:

10,5,7
10,12

實現程式碼:

/*
*Created on 2016年8月17日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*728**
[email protected]
*/ import java.util.Scanner; public class Main { public static int counter = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = Integer.valueOf(sc.nextLine()); String line = sc.nextLine(); compute(N, line); } public static void compute(int N, String line){ String[] arr = line.split(","); int len = arr.length; //從index=1開始存資料 Node[] nodeArr = new Node[len + 1]; for(int i = 0; i < len; i++){ int val = Integer.valueOf(arr[i]); nodeArr[i + 1] = new Node(val); } //構建二叉樹 Node root = nodeArr[1]; for(int i = 1; i < len + 1; i++){ if(i * 2 < len + 1){ nodeArr[i].left = nodeArr[2 * i]; } if(i * 2 + 1 < len + 1){ nodeArr[i].right = nodeArr[2 * i + 1]; } } // printTree(root); printPaths(root, len, N); } public static void printTree(Node root){ if(root == null){ return; } System.out.println(root.val); if(root.left != null){ printTree(root.left); } if(root.right != null){ printTree(root.right); } } public static void printPaths(Node root, int n, int N) { int[] path = new int[n]; printPaths(root, path, 0, N); if(counter == 0){ System.out.println("error"); } } public static void printPaths(Node root, int[] path, int pathLen, int N) { if (root == null) return; path[pathLen++] = root.val; if (root.left == null && root.right == null) { printArray(path, pathLen, N); } else { printPaths(root.left, path, pathLen, N); printPaths(root.right, path, pathLen, N); } } public static void printArray(int[] ints, int len, int N) { int total = 0; StringBuilder sb = new StringBuilder(); for (int i = 0; i < len; i++) { sb.append(ints[i] + ","); total += ints[i]; } if(total == N){ System.out.println(sb.toString().substring(0, sb.toString().length() - 1)); counter++; } } } class Node{ public int val; public Node left; public Node right; public Node(int val){ this.val = val; } }





相關推薦

所有路徑

前段時間什麼也不懂,就跑到騰訊去面試,然後面試官出了這道題,當時已碰演算法就悶,現在給出這道題目的解 另外再次感謝July仁兄對於各種面試題的整理,讓我有這些經典的題來練習。 題目:輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑

所有路徑-java實現

一個小演算法,分享一下思路: 描述: 寫一個程式建立一棵二叉樹,並按照一定規則,輸出二叉樹根節點到葉子節點的路徑。 規則如下: 1、從最頂端的根結點,到最下面的葉子節點,計算路徑通過的所有節點的和,如果與設定的某一值的相同,那麼輸出這條路徑上的所有節點。 2、從根節點遍歷

C++演算法之 在當中路徑

題目:輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。 打印出和與輸入整數相等的所有路徑。 例如 輸入整數22和如下二元樹       10          / \        5  12          / \   

每日一道演算法題4——在二元所有路徑

題目:輸入一個整數和一棵二元樹。從樹的根節點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。 例如輸入整數22和如下二元樹 則打印出兩條路徑:10,12和10,5,7 參考程式碼: #include <i

程式設計師面試一百題-04-在二元所有路徑

1-題目 : 輸入一個整數和一棵二元樹;從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑;打印出和與輸入整數相等的所有路徑。 2-示例 : 輸入整數22和如下二元樹,則應答應出兩條路徑10-12和10-5-7。 3-思路 : 3.1-當訪問到某一結點時,把該結點

劍指offer--面試題25:中和路徑--Java實現

題目描述: 輸入一課二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。 解題思路: 先模擬一下過程:樹的結構如下所示,期待路徑的和為22 10→5→4是一條路徑,它們的和不是22

LeetCode(Binary Tree Maximum Path Sum) 在最大的路徑

題目要求: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the belo

3.6 在找到累加指定的最長路徑長度

【題目】:   給定一棵二叉樹的頭節點head和一個32位整數sum,二叉樹節點值型別為整型,求累加和為sum的最長路徑長度。路徑是指從某個節點往下,每次最多選擇一個孩子節點或者不選所形成的的節點鏈   例如, 二叉樹如圖所示               -3           3   &

劍指Offer 面試題34:中和路徑 Java程式碼實現

題目:輸入一棵二叉樹和整數,打印出二叉樹中節點值得和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。 解題思路:路徑從根節點開始,應該用類似於前序遍歷的方式訪問樹節點。

劍指Offer 25題 中和路徑 Java

對二叉樹的相關演算法還是不瞭解。 這裡有兩點是之前所用不好的: 1:把棧用進來; 2:有一個變數記錄當前的數值,這個在遞迴的過程當中就能夠得到之前的值。 package test; import java.util.Stack; public class FindPat

劍指offer 中和路徑 Python實現

# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.rig

LeetCode104 給定一個其最大深度。 的深度根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 /** * Definition for a binary tree node. * struct TreeNode

(pyhon)給定一個整數陣列 nums 一個目標值 target,請你在該陣列目標值的那 兩個 整數,並返回他們的陣列下標。

方法一:使用最容易理解的遍歷陣列進行查詢 def solution(nums,target): #如果列表長度小於2,則直接結束 if len(nums) < 2: return #兩次迴圈列表,分別對列表中的所有可能的數字進行相加

leetcode104 給定一個其最大深度。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \

線索查詢前驅後繼的問題

線索二叉樹 結點結構定義如下: 若結點有左子樹,則LChild域仍指向其左孩子; 否則,LChild域指向其某種遍歷序列中的直接前驅結點。 若結點有右子樹,則RChild域仍指向其右孩子; 否則,RChild域指向其某種遍歷序列中的直接後繼結點。 L

劍指offer66題--Java實現,c++實現python實現 24.中和路徑

題目描述 輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前) C++ /* struct TreeNode { int val; s

兩個結點的最近公共祖先結點

一、搜尋二叉樹:第一變種是二叉樹是一種特殊的二叉樹:查詢二叉樹。也就是樹是排序過的,位於左子樹上的結點都比父結點小,而位於右子樹的結點都比父結點大。我們只需要從根結點開始和兩個結點進行比較。如果當前結點的值比兩個結點都大,則最低的共同父結點一定在當前結點的左子樹中。如果當前

兩個結點的最近的公共祖先結點

#pragma once #include <iostream> using namespace std; /****************  * 二叉樹中 找兩個結點的最近的公共祖先結

無序陣列N的兩個數 Two Sum

如果是有序陣列,很簡單。兩頭指標往中間相遇即可。 因此對於無序陣列,排序即可。 唯一的麻煩題目要求的:要返回兩個數在排序之前原數組裡的序號。因此我需要在排序時也要保留原來的序列號。 這裡主要是以前不寫STL的程式。這裡用到vector。pair。sort。 vector常

leetcode--maximum-depth-of-binary-tree(給定它的最大深度)

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,1