/*
* 面试题34:二叉树中,和为某一值的路径
* 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
* 思路:由于路径是从根节点出发到叶节点,在三种遍历中,只有前序遍历是首先访问根节点的。
*/
import java.util.ArrayList;
class TreeNode5 {
int val = 0;
TreeNode5 left = null;
TreeNode5 right = null;
public TreeNode5(int val) {
this.val = val;
}
}
public class No34FindPath {
public static void main(String[] args) {
No34FindPath n = new No34FindPath();
TreeNode5 root = new TreeNode5(10);
TreeNode5 node5 = new TreeNode5(5);
TreeNode5 node12 = new TreeNode5(12);
root.left = node5;
root.left.right = node12;
TreeNode5 node4 = new TreeNode5(4);
TreeNode5 node7 = new TreeNode5(7);
node5.left = node4;
node5.right = node7;
ArrayList<ArrayList<Integer>> a = n.FindPath(root ,19);
for (int i = 0; i < a.size(); i++)
{
System.out.println(a.get(i));
}
/*for(ArrayList<Integer> i:a){
System.out.println(i);
} */
}
//用来保存符合要求的路径
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
//用来保存一条路径
ArrayList<Integer> path = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode5 root, int target) {
if (root == null) {
return res;
}
findpath(root,target);
return res;
}
private void findpath(TreeNode5 root, int target) {
//将根节点加入到路径中
path.add(root.val);
//如果找到这个值,且到达叶子节点,则将这条路径放到res中,即符合要求的路径
if (root.val == target && root.left == null && root.right == null) {
res.add(new ArrayList<Integer>(path));
}
//如果不是叶子节点,则递归调用
if (!(root.left == null)) {
findpath(root.left ,target - root.val);
}
if (!(root.right == null)) {
findpath(root.right,target -root.val);
}
//在返回父节点之前,在路径上删除当前节点
path.remove(path.size() - 1);
return;
}
}
面试题34:二叉树中,和为某一值的路径
最新推荐文章于 2021-11-11 21:00:40 发布