Binary Tree Path Sum - Cracking the coding interview--Q4.8


Cracking the coding interview--Q4.8 - - 博客频道 - CSDN.NET
You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree - it does not have to start at the root.

译文:
给一个每个结点都包含一个值的二叉树,设计一个算法打印所有满足这个条件的路径:路径上结点的值加起来等于给定的一个值。注意:这些路径不一定从根节点开始。
解答
结点中包含指向父亲结点的指针,那么,只需要去遍历这棵二叉树, 然后从每个结点开始,不断地去累加上它父亲结点的值直到父亲结点为空(这个具有唯一性, 因为每个结点都只有一个父亲结点。也正因为这个唯一性, 可以不另外开额外的空间来保存路径),如果等于给定的值sum,则打印输出。

[MS100]在二元树中找出和为某一值的所有路径(树
    private static void helper(BSTreeNode root, int target, int sum, List<BSTreeNode> list){
        if(root == null){
            if(sum == target){
                for(int i=0; i<list.size(); i++)
                    System.out.print(list.get(i).value + " ");
                System.out.println();
            }
            return;
        }
        sum += root.value;
        list.add(root);
        if(root.left != null){
            helper(root.left, target, sum, list);
        }
        if(root.right != null){
            helper(root.right, target, sum, list);
        }
         
        if(root.left == null && root.right == null){
            helper(null, target, sum, list);
        }
         
        list.remove(root);
    }
     
    public static void printPath(BSTreeNode root, int target){
        if(root == null) return;
        List<BSTreeNode> list = new ArrayList<BSTreeNode>();
        int sum = 0;
        helper(root, target, sum, list);
    }


 public static void findSum(TreeNode head,int sum){
  if(head==null) return;
  TreeNode tnode=head;
  int tmp=0;
  for(int i=1;tnode!=null;i++){
   tmp+=tnode.value;
   if(tmp==sum)
    print(head,i);
   tnode=tnode.parent;
  }
  findSum(head.lchild,sum);
  findSum(head.rchild,sum);
 }
 private static void print(TreeNode tnode,int level){
  Stack<Integer> s=new Stack<Integer>();
  for(int i=0;i<level;i++){
   s.push(tnode.value);
   tnode=tnode.parent;
  }
  while(s.size()>0){
   System.out.print(s.pop()+" ");
  }
 }

http://www.hawstein.com/posts/4.8.html
方案1:如果结点中包含指向父亲结点的指针,那么,只需要去遍历这棵二叉树, 然后从每个结点开始,不断地去累加上它父亲结点的值直到父亲结点为空(这个具有唯一性, 因为每个结点都只有一个父亲结点。也正因为这个唯一性, 可以不另外开额外的空间来保存路径),如果等于给定的值sum,则打印输出。
void print(Node* head, int level){
    vector<int> v;
    for(int i=0; i<level; ++i){
        v.push_back(head->key);
        head = head->parent;
    }
    while(!v.empty()){
        cout<<v.back()<<" ";
        v.pop_back();
    }
    cout<<endl;
}
void find_sum(Node* head, int sum){
    if(head == NULL) return;
    Node *no = head;
    int tmp = 0;
    for(int i=1; no!=NULL; ++i){
        tmp += no->key;
        if(tmp == sum)
            print(head, i);
        no = no->parent;
    }
    find_sum(head->lchild, sum);
    find_sum(head->rchild, sum);
}
http://blog.csdn.net/java_wliang/article/details/41246583
  1.     public static void printRoad(TreeNode_4_8 start, int height) {  
  2.         int curHeight = 0;  
  3.         Stack<Integer> stack = new Stack<Integer>();  
  4.           
  5.         while(curHeight < height) {  
  6.             stack.push(start.data);  
  7.             start = start.parent;  
  8.             curHeight ++;  
  9.         }  
  10.           
  11.         while(!stack.empty()) {  
  12.             System.out.print("  " + stack.pop() + "  ");  
  13.         }  
  14.     }   
  15.     public static void find_sumvalue(TreeNode_4_8 node, int sum) {  
  16.         if(node == null) {  
  17.             return;  
  18.         }  
  19.         int curSum = 0;  
  20.         TreeNode_4_8 p = node, q;  
  21.         int height = 0;  
  22.         // 从每个结点开始,不断地去累加上它父亲结点的值直到父亲结点为空  
  23.         while(p != null) {  
  24.             curSum += p.data;  
  25.             // height 记录层数  
  26.             height ++;  
  27.             // 如果路径长度等级sum  
  28.             if(curSum == sum) {  
  29.                 // 打印路径  
  30.                 System.out.print("Find path : ");  
  31.                 printRoad(node, height);  
  32.                 System.out.print("\n");  
  33.                 break;  
  34.             } else if(curSum > sum){  
  35.                 break;  
  36.             }  
  37.             p = p.parent;  
  38.         }  
  39.           
  40.         find_sumvalue(node.lchild, sum);  
  41.         find_sumvalue(node.rchild, sum);  
  42.     }  
方案1和方案2的本质思想其实是一样的,不同的只是有无指向父亲结点的指针这个信息。 如果没有这个信息,则需要增加许多额外的空间来存储中间信息。
注意:方案1和方案2代码中的level并非指同一概念,方案1中level表示层数,最小值为1; 方案2中level表示第几层,最小值为0。
LeetCode - Problem Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
LeetCode - Path Sum II |  Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
Read full article from Cracking the coding interview--Q4.8 - - 博客频道 - CSDN.NET

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts