後序遍歷非遞歸,當遍歷到葉子結點時,將棧中所有的內容都按照格式要求生成列表返回。
static List<String> ret=new ArrayList<>();//全局變量
static public List<String> binaryTreePaths(TreeNode root) {
// write your code here
if(root==null) return ret;
Stack<TreeNode> sta=new Stack<>();
TreeNode p=root;
TreeNode pre=null;//後序遍歷非遞歸要用到一個pre指針
while(p!=null||!sta.isEmpty()){
if(p!=null)
{
sta.push(p);
p=p.left;
}
else {
p=sta.peek();//看一下最後一個節點的有節點有沒有訪問過
if(p.right!=null&&pre!=p.right){
p=p.right;
}
else{
p=sta.pop();
//處理棧中所有的數據
if(p.left==null&&p.right==null){
String a="";
for (TreeNode t:sta
) {
a=a+"->"+t.val;
}
a+="->"+p.val;
a=a.substring(2,a.length());
ret.add(a);
}
pre=p;
p=null;
}
}
}
return ret;
}