迭代实现前序遍历
144. 二叉树的前序遍历 - 力扣(LeetCode)
题解的迭代方式
因为在递归的过程中使用了系统栈,所以在迭代的解法中常用 Stack
来模拟系统栈,来模拟递归。
首先创建一个 Stack 用来存放节点,此时 Stack 为空,优先将根结点加入 Stack,然后进行相关处理(打印、加入列表等等)。
之后我们应该先处理左子树,然后右子树。所以先加入 Stack 的应该是右子树,然后左子树。
public List<Integer> preorderTraversal(TreeNode root)
{//树中节点数目在范围 [0, 100] 内if (root == null)return new ArrayList<>();ArrayList<Integer> answer = new ArrayList<>();ArrayDeque<TreeNode> stack = new ArrayDeque<>();stack.add(root);while (!stack.isEmpty()){TreeNode node = stack.pop();answer.add(node.val);if (node.right != null)stack.push(node.right);if (node.left != null)stack.push(node.left);}return answer;
}
算法村的迭代方式
public List<Integer> preorderTraversal_3(TreeNode root)
{ArrayList<Integer> answer = new ArrayList<>();ArrayDeque<TreeNode> stack = new ArrayDeque<>();//再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树//不需要往栈中提前添加根结点!!!while (!stack.isEmpty() || root != null){while (root != null){answer.add(root.val);stack.push(root);//先遍历左子树root = root.left;}TreeNode curNode = stack.pop();//再遍历右子树root = curNode.right;}return answer;
}
迭代实现中序遍历
94. 二叉树的中序遍历 - 力扣(LeetCode)
中序遍历是左中右,先访问二叉树左子树的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(把节点的val放进 answer 列表中)
当处理完最小单位的子树时,返回到上层处理中间节点。如果有右节点,也要就其进行中序遍历。
public static List<Integer> inorderTraversal(TreeNode root)
{ArrayList<Integer> answer = new ArrayList<>();ArrayDeque<TreeNode> stack = new ArrayDeque<>();//再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树//不需要往栈中提前添加根结点!!!while (!stack.isEmpty() || root != null){while (root != null){stack.push(root);root = root.left;}TreeNode curNode = stack.pop();answer.add(curNode.val);root = curNode.right;}return answer;
}
迭代实现后序遍历
145. 二叉树的后序遍历 - 力扣(LeetCode)
将后序遍历序列反转后得到的序列是“中右左”,而前序遍历序列是“中左右”。所有,我们将前序遍历的遍历次序改变一下,再把结果完全反转,即可得到所要的后序遍历序列。
public List<Integer> postorderTraversal(TreeNode root)
{ArrayList<Integer> answer = new ArrayList<>();ArrayDeque<TreeNode> stack = new ArrayDeque<>();//再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树//不需要往栈中提前添加根结点!!!while (!stack.isEmpty() || root != null){while (root != null){answer.add(root.val);stack.push(root);//先遍历右子树root = root.right;}TreeNode curNode = stack.pop();//再遍历左子树root = curNode.left;}//反转“右前序遍历”的序列,得到后序遍历的序列Collections.reverse(answer);return answer;
}