代码随想录算法训练营day12||二叉树递归遍历和迭代遍历

Day12

二叉树的递归遍历


三道题目

  • 144.二叉树的前序遍历

  • 145.二叉树的后序遍历

  • 94.二叉树的中序遍历

思路

  • 递归遍历要注意的有三点

  • 首先是确定递归函数的输入参数和返回类型

  • 然后是确定递归结束的条件

  • 最后是写单层递归的逻辑

代码

//前序遍历
class Solution {
    public List preorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        preorder(root,res);
        return res;
    }
    private void preorder(TreeNode node, List res){//传入一个node和存放结果集合res
        if (node != null){//循环终止条件是这个node是null
            res.add(node.val);//如果不是null,根据前序遍历依次加入即可
            preorder(node.left,res);
            preorder(node.right,res);
        }
    }
}
//中序遍历
class Solution {
    public List inorderTraversal(TreeNode root) {

        List res = new ArrayList<>();
        inorder(res,root);
        return res;
    }
    private void inorder(List res, TreeNode node){
        if (node == null) return;
        inorder(res,node.left);
        res.add(node.val);
        inorder(res,node.right);
    }
}
//后序遍历
class Solution {
    public List postorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        postorder(root,res);
        return res;
    }
    private void postorder(TreeNode node,List res){
        if (node == null) return;
        postorder(node.left,res);
        postorder(node.right,res);
        res.add(node.val);
    }
}

二叉树的迭代遍历


思路

  • 对于前序遍历,逻辑是这样的,给一个栈,最开始加入根结点

  • 然后先pop出一个结点,在结果集合中加入这个结点,然后加入这个节点的右子节点

  • 然后再加入这个结点的左子节点

  • 注意,stack中的push和ArrayDeque中的addFirst相同

  • 后序遍历和前序遍历类似,不同的是,先左再右,最后再翻转res集合

  • 中序遍历复杂些,逻辑是,先一直向左走,不断push入栈,遇到空就pop,然后向右看,把右边的入栈

代码

//前序遍历
class Solution {
    public List preorderTraversal(TreeNode root) {

        List res = new ArrayList<>();
        if (root == null) return res;
        Deque stack = new ArrayDeque<>();
        stack.addFirst(root);
        while (!stack.isEmpty()){//当栈空时,遍历结束,可以结束循环
            TreeNode temp = stack.removeFirst();//先pop一个结点
            res.add(temp.val);
            if (temp.right != null){//不是while因为是一层
                stack.addFirst(temp.right);//向右添加
            }
            if (temp.left != null){
                stack.addFirst(temp.left);//向左添加
            }
        }
        return res;
    }
}
//后序遍历
class Solution {
    public List postorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        if (root == null) return res;
        Deque stack = new ArrayDeque<>();
        stack.addFirst(root);
        while (!stack.isEmpty()){
            TreeNode temp = stack.pop();
            res.add(temp.val);
            if (temp.left != null) stack.addFirst(temp.left);
            if (temp.right != null) stack.addFirst(temp.right);
        }
        Collections.reverse(res);//翻转集合
        return res;
    }
}
//中序遍历
class Solution {
    public List inorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        Deque stack = new ArrayDeque<>();
        TreeNode temp = root;
        while (temp != null || !stack.isEmpty()) {
            if (temp != null) {
                stack.addFirst(temp);
                temp = temp.left;
            } else {
                temp = stack.removeFirst();
                res.add(temp.val);
                temp = temp.right;
            }
        }
        return res;
    }
}

总结

今天学习了二叉树的递归遍历和迭代遍历,学习状态不太好,晚上和明天加油!

你可能感兴趣的:(算法,数据结构,c++)