思路
下面的代码以中序遍历做示范,思路在代码中详细注释了。前序遍历和后序遍历只需要调整当前节点和左右孩子节点压入栈中的顺序即可。
代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
inorder(root,result);
return result;
}
public void inorder(TreeNode root,List<Integer> result){
if (root==null){
return;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
//先看一下栈顶元素是什么,如果不为空就取出来,然后按照右孩子->当前节点->左孩子的顺序压入栈中
TreeNode node = stack.peek();
if(node!=null){
//如果栈顶元素不是空元素就把栈顶元素弹出
TreeNode treeNode = stack.pop();
//把右孩子先入栈
if(treeNode.right!=null){
stack.push(treeNode.right);
}
//然后把当前节点入栈
stack.push(treeNode);
//再压入一个null用来标记,当下次发现栈顶是null的时候就需要把null下面的那个元素添加到result中了
//因为null下面的这个元素就相当于是中序遍历:左、中、右。里边的"中"。
stack.push(null);
//把左孩子入栈
if(treeNode.left!=null){
stack.push(treeNode.left);
}
}else {
stack.pop();
TreeNode treeNode = stack.pop();
result.add(treeNode.val);
}
}
}
}