二叉树-二叉树的遍历方式 | 144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、层序遍历

144.二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 

题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/ 

思路:

1.递归:单独写一个前序遍历方法,传入参数为结点和结果list,调用该方法。在方法中,如果结点为空则已经遍历到最底层,返回。如果不为空则添加结点的值到结果list,并再次调用自身遍历左孩子和右孩子。

2.迭代:如果结点为空则直接返回空的list。建立栈。先将当前结点入栈,弹出时将结点的值加入list,再分别将右孩子和左孩子入栈(这样会先弹出左孩子),当栈不为空时继续while循环,当栈为空时说明遍历结束。

代码:(来源:代码随想录、代码随想录 )

// 前序遍历·递归
class Solution {
    public List preorderTraversal(TreeNode root) {
        List result = new ArrayList();
        preorder(root, result);
        return result;
    }

    public void preorder(TreeNode root, List result) {
        if (root == null) {
            return;
        }
        result.add(root.val);
        preorder(root.left, result);
        preorder(root.right, result);
    }
}

// 前序遍历·迭代
// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {
    public List preorderTraversal(TreeNode root) {
        List result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if (node.right != null){
                stack.push(node.right);
            }
            if (node.left != null){
                stack.push(node.left);
            }
        }
        return result;
    }
}

94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 

题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/  

思路:

1.递归:单独写一个中序遍历方法,传入参数为结点和结果list,调用该方法。在方法中,如果结点为空则已经遍历到最底层,返回。如果不为空则先调用自身遍历左孩子,再添加结点的值到结果list,再调用自身遍历右孩子。

2.迭代:因为中序遍历时元素的处理顺序和访问顺序不一致,在迭代法中需要用到指针访问结点,而栈用来处理结点上的元素。如果结点为空则直接返回空的list。建立栈。将指针指向当前结点。当当前结点或栈不为空时处理元素,如果当前结点不为空,先将当前结点入栈,再将指针指向左孩子,到当前结点为空时弹出元素并将指针指向右孩子,重复当前循环。当前结点和栈都为空时说明遍历结束。

代码:(来源:代码随想录、代码随想录 ) 

// 中序遍历·递归
class Solution {
    public List inorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        inorder(root, res);
        return res;
    }

    void inorder(TreeNode root, List list) {
        if (root == null) {
            return;
        }
        inorder(root.left, list);
        list.add(root.val);             // 注意这一句
        inorder(root.right, list);
    }
}

// 中序遍历·迭代
// 中序遍历顺序: 左-中-右 入栈顺序: 左-右
class Solution {
    public List inorderTraversal(TreeNode root) {
        List result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.isEmpty()){
           if (cur != null){
               stack.push(cur);
               cur = cur.left;
           }else{
               cur = stack.pop();
               result.add(cur.val);
               cur = cur.right;
           }
        }
        return result;
    }
}

145.二叉树的后序遍历 

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 

题目链接:https://leetcode.cn/problems/binary-tree-postorder-traversal/   

思路:

1.递归:单独写一个后序遍历方法,传入参数为结点和结果list,调用该方法。在方法中,如果结点为空则已经遍历到最底层,返回。如果不为空则调用自身遍历左孩子和右孩子,再添加结点的值到结果list。

2.迭代:思路与前序遍历相似。如果结点为空则直接返回空的list。建立栈。先将当前结点入栈,弹出时将结点的值加入list,再分别将左孩子和右孩子入栈(这样会先弹出右孩子),当栈不为空时继续while循环,当栈为空时说明遍历结束。最后反转list,得到的结果就是左右中的后序遍历。

代码:(来源:代码随想录、代码随想录 )  

// 后序遍历·递归
class Solution {
    public List postorderTraversal(TreeNode root) {
        List res = new ArrayList<>();
        postorder(root, res);
        return res;
    }

    void postorder(TreeNode root, List list) {
        if (root == null) {
            return;
        }
        postorder(root.left, list);
        postorder(root.right, list);
        list.add(root.val);             // 注意这一句
    }
}

// 后序遍历·迭代
// 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果
class Solution {
    public List postorderTraversal(TreeNode root) {
        List result = new ArrayList<>();
        if (root == null){
            return result;
        }
        Stack stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            result.add(node.val);
            if (node.left != null){
                stack.push(node.left);
            }
            if (node.right != null){
                stack.push(node.right);
            }
        }
        Collections.reverse(result);
        return result;
    }
}

层序遍历

层序遍历的实现主要是借助队列,队列先进先出的结构符合一层一层遍历的逻辑。具体实现时,先记录当前队列大小que.size(),然后循环que.size()次,每次都弹出队列最前节点同时将节点的左右孩子入队。

你可能感兴趣的:(LeetCode,代码随想录(Java版),算法,数据结构,leetcode,java)