bfs(非递归 while循环实现的后序遍历) 该题可视作后序遍历的变种(原因画图后,很容易得出),直接写出该题的代码并理解其逻辑可能有些复杂,故而我们从后序遍历的代码开始,改为该题的解法代码,可以降低理解的思维难度:

常规后序遍历代码:(当然,如果对你来说不够常规或者根本没有印象的话,只能说数据结构与算法基本功不扎实)

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    public int sumNumbers (TreeNode root) {
        // write code here
        Stack<TreeNode> nodeStack = new Stack<>();
        //本题在dfs基础上,添加了两个关键点
        //1.引入valueStack,存储值
        //Stack<Integer> valueStack = new Stack<>();
        //valueStack.push(0);
        TreeNode node = root;
        int total=0;
        while(node!=null || !nodeStack.isEmpty()){
            if(node!=null){
                //valueStack栈每深入一层,值都=上一层值*10+当前层的值
                valueStack.push(valueStack.peek()*10+node.val);
                nodeStack.push(node);
                node=node.left;
            }else{
                node=nodeStack.pop();
                //只有当该node为空节点时,才把valueStack栈顶的值加入total
                //if(node.left==null&&node.right==null){
                  //  total+=valueStack.peek();
                //}
                 visit(node);//visit()是要node节点的遍历方式,视问题而定
                //valueStack.pop()
                node=node.right;
            }
        }
        return total;
    }
    
}

以上代码 作为 后序遍历写法(非递归写法)的通用模板(注释部分是为了方便和下面本题的解法代码相对比),极大的降低了 代码编写难度!

本体解法代码:

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    public int sumNumbers (TreeNode root) {
        // write code here
        Stack<TreeNode> nodeStack = new Stack<>();
        //本题在dfs基础上,添加了两个关键点
        //1.引入valueStack,存储值
        Stack<Integer> valueStack = new Stack<>();
        valueStack.push(0);
        TreeNode node = root;
        //r是后序遍历所需的一个指针,用于记录最近访问过的节点
        TreeNode r=null;
        int total=0;
        while(node!=null || !nodeStack.isEmpty()){
            if(node!=null){
                //valueStack栈每深入一层,值都=上一层值*10+当前层的值
                valueStack.push(valueStack.peek()*10+node.val);
                nodeStack.push(node);
                node=node.left;
            }else{
                node=nodeStack.peek();
                if(node.right!=null&&node.right!=r){
                    node=node.right;
                }else{
                    node=nodeStack.pop();
                    
                    //只有当该node为空节点时,才把valueStack栈顶的值加入total
                    if(node.left==null&&node.right==null){
                        total+=valueStack.peek();
                    }
                    valueStack.pop();
                    r=node;
                    node=null;
                }
            }
        }
        return total;
    }
}

画图后很容易体会出valueStack的妙处,它的引入是本题的思考难度的主要来源!