二叉树遍历路径及节点后输出全部路径
就是在传统二叉树遍历节点的基础上加了个路径栈,把所有路径记录下来返回(参考大神的代码才搞懂的):
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;
}
查看18道真题和解析
