2025年--Lc218-145. 二叉树的后序遍历(非递归版,栈,带测试用例)-Java版
1.题目


2.思路
用栈实现,正常的后序遍历是左右根
添加一个辅助栈,节点入栈的顺序是根右左,这样节点弹出的时候才是左右根。
(1)根节点首先被压入stack中,然后被弹出并压入output中。
(2)遍历过程:
stack用于存储需要遍历的节点。
output用于反转遍历顺序。
入栈顺序:
st的根入栈了先弹出。然后st的根节点的左子节点先入栈,右子节点后入栈。这样st出栈顺序是右-左。
out 里存的是“根-右 左”这种倒着的遍历顺序
我从 out 反向弹出时,就变成了“左 右 根”
(3)将output中的节点依次弹出并存入结果列表result中,这样得到的顺序就是后序遍历(左-右-根)。
3.代码实现
输入root=[1,2,3]
输出[2,3,1]
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){};TreeNode(int val){this.val=val;};TreeNode(int val,TreeNode left,TreeNode right){this.val=val;this.left=left;this.right=right;}
}
public class postOrder2 {//这边的root代表一个数组,存放各个节点public List<Integer> pTS(TreeNode root){//1.先定义一个用于遍历结果的空列表List<Integer> res=new ArrayList<>();//2.初始化一个空栈,存储需要遍历的节点,也就是存入栈元素Stack<TreeNode> st=new Stack<>();//将根节点的内容压入栈中,比如root = [1,2,3]st.push(root);//辅助栈弹结果,用户反转遍历顺序。反转是根右左,正确的是左右根。Stack<TreeNode> out=new Stack<>();while(!st.isEmpty())//当栈不空的时候{//将栈中当前值弹出。//st先存的根先弹出也是根,st再存左右,st弹出的时候是右左TreeNode cur= st.pop();//将当前节点推入辅助栈,out存的顺序是根右左out.push(cur);//入栈先左后右(根左右)if(cur.left!=null){st.push(cur.left);}if(cur.right!=null){st.push(cur.right);}}//当辅助栈的元素不为空,出栈先右后左while(!out.isEmpty()){//弹出的顺序正好是左右根//再反转弹出 左右根res.add(out.pop().val);}return res;}public static void main(String[] args){TreeNode root=new TreeNode(1);root.left=new TreeNode(2);root.right=new TreeNode(3);postOrder2 test=new postOrder2();List<Integer> res=test.pTS(root);System.out.println(res);}}