二叉树遍历路径及节点后输出全部路径
就是在传统二叉树遍历节点的基础上加了个路径栈,把所有路径记录下来返回(参考大神的代码才搞懂的):
import java.util.*; public class Main { public static void main(String[] args) { TreeNode0 cc = new TreeNode0(); cc.val=5; cc.left=new TreeNode0(); cc.left.val=4; cc.left.left=new TreeNode0(); cc.left.left.val=1; cc.left.right=new TreeNode0(); cc.left.right.val=11; cc.left.right.left=new TreeNode0(); cc.left.right.left.val=2; cc.left.right.right=new TreeNode0(); cc.left.right.right.val=7; cc.right=new TreeNode0(); cc.right.val=8; cc.right.right=new TreeNode0(); cc.right.right.val=9; cc.right.left=new TreeNode0(); cc.right.left.val=3; Main me = new Main(); System.out.println(me.TreeDFS(cc).toString()); } //遍历二叉树的每个路径及节点 public ArrayList<ArrayList<Integer>> TreeDFS(TreeNode0 root){ ArrayList<ArrayList<Integer>> aai = new ArrayList<>();//存放最终要输出的路径 ArrayList<Integer> ai = new ArrayList<>();//存放第一次入路径栈的值,及根节点值 //存放路径和节点的栈,运行过程中路径栈与节点栈是对应的,例如节点栈栈顶为11时,路径栈的栈顶就是根节点到11这条节点的路径 Stack<ArrayList<Integer>> sai =new Stack<>(); Stack<TreeNode0> st = new Stack<>();//存放节点的栈 st.add(root);//将根节点压入节点栈 ai.add(root.val); sai.add(ai);//将根节点值压入路径栈 while (!st.empty()){ TreeNode0 tn=st.pop();//弹出节点栈的栈顶 ArrayList<Integer> temp = sai.pop();//弹出路径栈的栈顶 //若是叶子节点,就把路径放入最终输出结果中 if (tn.left==null && tn.right==null){ aai.add(temp); } //若不是叶子节点,就对节点下级的左右节点进行四步处理 if (tn.left!=null){ st.push(tn.left);//左节点放入栈 temp.add(tn.left.val);//左节点值加入临时路径 sai.add(new ArrayList<>(temp));//临时路径复制后加入路径栈 //把临时路径最后一个值(即刚刚放进来的这个左节点值)删除,因为路径已经入栈,不需要了,再留着会导致后边处理右节点时路径混乱 temp.remove(temp.size()-1); } if (tn.right!=null){ st.push(tn.right); temp.add(tn.right.val); sai.add(new ArrayList<>(temp)); temp.remove(temp.size()-1); } } return aai; } } class TreeNode0 { int val = 0; TreeNode0 left = null; TreeNode0 right = null; }