【IT笔试面试题整理】二叉树中和为某一值的路径--从根到叶子节点
2017-12-15 14:35
204 查看
【试题描述】
输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条
路径。打印出和与输入整数相等的所有路径。
例如输入整数 22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和 10, 5, 7。
据说这是百度的一道笔试题。
分析:这道题考查对二叉树遍历方式的理解,采用后序遍历,如果把二叉树看成图,就是图的深度遍历。使用变量存放当前遍历的路径和,当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点,因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。
【参考代码】
1 public static void findPath(Node root, int sum, int curSum, LinkedList path) 2 { 3 if (root == null) 4 return; 5 curSum += root.value; 6 path.add(root.value); 7 8 // if the node is a leaf, and the sum is same as pre-defined, 9 // the path is what we want. print the path 10 if (root.left == null && root.right == null && curSum == sum) 11 { 12 System.out.println("Find a path: "); 13 Iterator it = path.iterator(); 14 while (it.hasNext()) 15 { 16 System.out.print(it.next() + " ");// 打印路径节点的值 17 } 18 System.out.println(); 19 } 20 21 // if the node is not a leaf, goto its children 22 if (root.left != null) 23 findPath(root.left, sum, curSum, path); 24 if (root.right != null) 25 findPath(root.right, sum, curSum, path); 26 27 // when we finish visiting a node and return to its parent node, 28 // we should delete this node from the path and 29 // minus the node's value from the current sum 30 curSum -= root.value; 31 path.pollLast(); 32 }
相关文章推荐
- 【IT笔试面试题整理】二叉树中和为某一值的路径--所有可能路径
- 【IT笔试面试题整理】有序数组生成最小高度二叉树
- 【IT笔试面试题整理】给定二叉树,给每层生成一个链表
- 【IT笔试面试题整理】给定二叉树先序中序,建立二叉树的递归算法
- 【IT笔试面试题整理】判断一个二叉树是否是平衡的?
- 【IT笔试面试题整理】连续子数组的最大和
- 【IT笔试面试题整理】判断一个树是否是另一个的子树
- 面试题25 二叉树中和为某一值的路径
- 剑指offer-面试题25:二叉树中和为某一值的路径
- 【IT笔试面试题整理】数组中出现次数超过一半的数字
- 面试题29:二叉树中和为某一值的路径
- 剑指offer面试题之二叉树中和为某一值的所有路径
- 面试题25:二叉树中和为某一值的路径
- 【剑指offer】面试题34:二叉树中和为某一值的路径
- 【IT笔试面试题整理】海盗分宝石
- 面试题25_二叉树中和为某一值的路径
- 剑指offer--面试题25: 二叉树中和为某一值的路径
- 面试题 25:二叉树中和为某一值的路径
- 《剑指Offer》面试题25:二叉树中和为某一值的路径
- 面试题25:二叉树中和为某一值的路径