LeetCode热题100道-day06

9,426 阅读1分钟

LeetCode热题100道-day06

144. 二叉树的前序遍历

144. 二叉树的前序遍历

  • 非递归、栈
class Solution {  
    List<Integer> list = new ArrayList<>();  
    public List<Integer> preorderTraversal(TreeNode root) {  
        if(root == null) return list;  
        Stack<TreeNode> stack = new Stack<>();  
        TreeNode node = root;  
        while(true){  
            if(node != null){  
                list.add(node.val);  
                if(node.right !=null){  
                    stack.push(node.right);  
                }  
                node = node.left;  
            }else if(stack.isEmpty()){  
                return list;  
            }else{  
                node = stack.pop();  
            }  
        }  
    }  
}

94. 二叉树的中序遍历

94. 二叉树的中序遍历

  • 非递归、栈
class Solution {  
    public List<Integer> inorderTraversal(TreeNode root) {  
        List<Integer> list = new ArrayList<>();  
        Stack<TreeNode> stack = new Stack<>();  
        TreeNode cur = root;  
        while (cur != null || !stack.isEmpty()) {  
            if (cur != null) {  
                stack.push(cur);  
                cur = cur.left;  
            } else {  
                cur = stack.pop();  
                list.add(cur.val);  
                cur = cur.right;  
            }  
        }  
        return list;  
    }  
}

145. 二叉树的后序遍历

145. 二叉树的后序遍历

  • 非递归、栈
public List<Integer> postorderTraversal1(TreeNode root) {//非递归写法  
    List<Integer> res = new ArrayList<Integer>();  
    if(root == null)  
        return res;  
    Stack<TreeNode> stack = new Stack<TreeNode>();  
    TreeNode pre = null;  
    stack.push(root);  
    while(!stack.isEmpty()){  
        TreeNode curr = stack.peek();  
        if((curr.left == null && curr.right == null) ||  
                (pre != null && (pre == curr.left || pre == curr.right))){  
            //如果当前结点左右子节点为空或上一个访问的结点为当前结点的子节点时,当前结点出栈  
            res.add(curr.val);  
            pre = curr;  
            stack.pop();  
        }else{  
            if(curr.right != null) stack.push(curr.right); //先将右结点压栈  
            if(curr.left != null) stack.push(curr.left);   //再将左结点入栈  
        }  
    }  
    return res;  
}