输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输入整数22 和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12 和10, 5, 7。
使用递归+回溯的方法
思路:
(1)若根节点的值大于给定的值或者根节点为空,则清空路径;
(2)若根节点的值等于给定的值,需要判断当前节点是否为叶子节点,若为叶子节点,则是需要找的一条路径,存放在栈中。若不是,将保存的节点全部清空。
(3)若根节点的和小于给定的值,则分别去访问其左右子树
public class test4{ public static class Node{ private int value; private Node leftNode; private Node rightNode; public Node(int value,Node leftNode,Node rightNode){ this.value = value; this.leftNode = leftNode; this.rightNode = rightNode; } } public void findpath(Node node,int num){ if (node.value > num || node == null){ return; } //使用栈来保存路径上的节点 Stack<Integer> s = new Stack<>(); int currentsum = 0; findpath(node,num,s,currentsum); } public void findpath(Node node,int num,Stack<Integer> s,int curretnsum){ s.push(node.value); curretnsum += node.value; boolean isleaf = (node.leftNode == null && node.rightNode == null); //如果该节点为叶子节点,且路径和=sum if (curretnsum == num && isleaf){ //打印路径 printstack(s); } //如果不是叶子节点 则遍历他的节点 if (node.leftNode != null){ findpath(node,num,s,curretnsum); } if (node.rightNode !=null){ findpath(node,num,s,curretnsum); } s.pop(); curretnsum -= node.value; } public void printstack(Stack<Integer> s){ Stack<Integer> tem = new Stack<>(); while (!s.isEmpty()){ tem.add(s.pop()); }while (!tem.isEmpty()){ int num = tem.pop(); System.out.println(num + ""); s.add(num); } } }