二叉树遍历路径及节点后输出全部路径

就是在传统二叉树遍历节点的基础上加了个路径栈,把所有路径记录下来返回(参考大神的代码才搞懂的):

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;
}

全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
06-06 21:28
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务