题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解题思路
首先寻找路径,我们可以利用前序遍历的思想,即从根节点开始,这也是题目的要求之一,根节点然后左右子树。我们每次访问一个节点时,先将节点添加到路径中去,接着用目标值减去该节点的值,如果目标值为零,且判断出该节点为叶子节点,则路径符合要求。如果判断出不是叶子节点,则继续递归遍历****左子树和****右子树,当前结点访问结束后,递归函数将自动回到它的父结点。因此我们在函数退出之前要在路径上删除当前结点,以确保返回父结点时路径刚好是从根结点到父结点的路径。
图示
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
import java.util.ArrayList;
class TreeNode{ //定义二叉树的节点
TreeNode father;
int val;
TreeNode left;
TreeNode right;
TreeNode(TreeNode left,TreeNode right){
this.left=left;
this.right=right;
}
TreeNode(int val){
this.val=val;
}
TreeNode(){}
}
public class findPathEqualSum {
//寻找二叉树中和为某一值的路径
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
ArrayList<Integer> temp=new ArrayList<>();
public ArrayList<ArrayList<Integer>> findPath(TreeNode root,int target){
if (root==null){
return res;
}
target-=root.val;
temp.add(root.val);
if (target==0&&root.left==null&&root.right==null){
res.add(new ArrayList<Integer>(temp));
}else {
findPath(root.left,target);
findPath(root.right,target);
}
temp.remove(temp.size()-1);
return res;
}
public static void main(String[] args) {
TreeNode node1=new TreeNode(10);
TreeNode node2=new TreeNode(6);
TreeNode node3=new TreeNode(14);
TreeNode node4=new TreeNode(4);
TreeNode node5=new TreeNode(8);
node1.left=node2;node1.right=node3;
node2.left=node4;node2.right=node5;
node3.left=null;node3.right=null;
node4.left=null;node4.right=null;
node5.left=null;node5.right=null;
findPathEqualSum test=new findPathEqualSum();
ArrayList<ArrayList<Integer>> res=test.findPath(node1,24);
System.out.println(res);
}
}
总结
本题来源于面试经典教材《剑指offer》中 归属于二叉树类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢AIAS!