二叉树应用非常广,我们经常遇到需要处理它们路径相关应用问题,花里胡哨的变形应用太多,譬如“求和为某一值的路径、求和最大的路径、求和最小的路径等等”往往让人困惑不已,但如果能随时将所有的路径全部得到,那这些应用是完全没有难度的。
进入正题!
假设某一棵二叉树元素全部是整数,怎么获得它的所有路径呢?
下面使用递归实现这一功能!暴力的返回所有的路径!不落下任何一条路径!
import org.junit.Test;
import java.util.ArrayList;
public class printAllPaths {
class treeNode {
public int val;
public treeNode left;
public treeNode right;
public treeNode(int data) {
this.val = data;
}
}
public void printPaths(treeNode node,ArrayList<Integer> singlePath , ArrayList<ArrayList<Integer>>allPaths) {
if (node == null) {//遇到空,直接返回
return;
}
singlePath.add(node.val);//将当前的结点值加入路径
if (node.left==null&&node.right==null){//遇到叶子了,这时候应该把这条路径加进去!
allPaths.add(new ArrayList<>(singlePath));
}else{
printPaths(node.left,singlePath, allPaths);
printPaths(node.right,singlePath, allPaths);
}
singlePath.remove(singlePath.size()-1);//必须!不管遇到是不是叶子结点,都要回退一个结点,返回上一层!
}
@Test
public void t1(){
treeNode head=new treeNode(1);
head.left=new treeNode(2);
head.right=new treeNode(3);
head.left.left=new treeNode(4);
head.left. right=new treeNode(66);
head.left.left.left=new treeNode(55);
head.right.left=new treeNode(31);
head.right.right=new treeNode(32);
head.right.right.right=new treeNode(35);
ArrayList<Integer> singlePath = new ArrayList<Integer> ();//单条路径,是临时变量
ArrayList<ArrayList<Integer>>allPaths=new ArrayList<ArrayList<Integer>>();//总的结果,会将所有的遍历结果保存起来!
printPaths(head,singlePath,allPaths);
System.out.println("前面树的全部路径(从根节点到某一个叶子中间所有结点)为:");
for (ArrayList<Integer>list1:allPaths){
System.out.println(list1.toString());
}
}
}
这是非常有用的!