不用递归的方法取遍历二叉树
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
先序遍历
思路如下:
- 先创建一个栈
- 把根节点入栈
- 循环取栈顶的元素并且访问它
- 把当前元素的右子树和左子树分别入栈
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if(root == null){
return result;
}
stack.push(root);
while (!stack.isEmpty()){
TreeNode cur = stack.pop();
result.add(cur.val);
if(cur.right != null){
stack.push(cur.right);
}
if(cur.left != null){
stack.push(cur.left);
}
}
return result;
}
}
这道题的核心是将根节点先入栈,然后取栈顶元素访问,插入右子树,插入左子树,就可以实现啦
中序遍历
核心思路
- 需要创建一个cur指向来在树上移动
- 如果cur不为空,一路push,一路向左
- cur为空时,取出栈顶元素,并且 cur = top.right
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (true){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
//走到这一步,cur 为空,取栈顶元素
if(stack.isEmpty()){
break;
}
TreeNode top = stack.pop();
result.add(top.val);
cur = top.right;
}
return result;
}
}
后序遍历
https://leetcode-cn.com/problems/binary-tree-postorder-traversal/
这个就有点复杂了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
TreeNode cur = root;
TreeNode prev = null;
while (true){
while (cur != null){
//cur不为空就一路入栈一路向左
stack.push(cur);
cur = cur.left;
}
//此时cur 为空
if(stack.isEmpty()){
break;//遍历结束
}
TreeNode top = stack.peek();
if(top.right == null || top.right == prev){
//这种情况说明可以访问top节点
TreeNode rTop = stack.pop();
result.add(rTop.val);
prev = top;
}else {
cur = top.right;
}
}
return result;
}
}
在取栈顶元素不能直接访问了,需要判断,如果这个元素右子树为空或者右子树访问过了,就可以访问