算法跟练第十一弹——二叉树

文章目录

  • [part01 递归遍历](#part01 递归遍历)
    • [1.1 二叉树的前序遍历](#1.1 二叉树的前序遍历)
    • [1.2 二叉树的中序遍历](#1.2 二叉树的中序遍历)
    • [1.3 二叉树的后序遍历](#1.3 二叉树的后序遍历)
  • [part02 迭代遍历](#part02 迭代遍历)
    • [2.1 二叉树的前序遍历](#2.1 二叉树的前序遍历)
    • [2.2 二叉树的中序遍历](#2.2 二叉树的中序遍历)
    • [2.3 二叉树的后序遍历](#2.3 二叉树的后序遍历)
  • [part03 层序遍历](#part03 层序遍历)
    • [3.1 二叉树的层序遍历](#3.1 二叉树的层序遍历)
    • [3.2 二叉树的层序遍历II](#3.2 二叉树的层序遍历II)
    • [3.3 二叉树的右视图](#3.3 二叉树的右视图)
  • 归纳

跟着代码随想录刷题的第十一天。

代码随想录链接:代码随想录

part01 递归遍历

前序遍历:中左右

中序遍历:左中右

后序遍历:左右中

1.1 二叉树的前序遍历

题目链接:二叉树的前序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();

        pre(root,result);

        return result;
    }

    public void pre(TreeNode root,List<Integer>result){
        if(root==null){
            return;
        }

        result.add(root.val);
        pre(root.left,result);
        pre(root.right,result);

    }
}

1.2 二叉树的中序遍历

题目链接:二叉树的中序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        pre(root,result);
        return result;
    }

    public void pre(TreeNode root,List<Integer>result){
        if(root == null)
            return;

        pre(root.left,result);
        result.add(root.val);
        pre(root.right,result);

    }
}

1.3 二叉树的后序遍历

题目链接:二叉树的后序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        pre(root,result);
        return result;
    }

    public void pre(TreeNode root,List<Integer>result){
        if(root==null)
            return;

        pre(root.left,result);
        pre(root.right,result);
        result.add(root.val);
    }
}

part02 迭代遍历

2.1 二叉树的前序遍历

题目链接:二叉树的前序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
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 node = stack.peek();
            result.add(stack.pop().val);
            if(node.right!=null)
                stack.push(node.right);
            if(node.left!=null)
                stack.push(node.left);
        }

        return result;
    }
}

2.2 二叉树的中序遍历

题目链接:二叉树的中序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
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(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;
    }
}

题解:主要是要考虑应该将左孩子全部入栈,再出栈,出栈时判断是否存在右孩子,存在就把指针指向右孩子

2.3 二叉树的后序遍历

题目链接:二叉树的后序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root == null)
            return result;

        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;
    }
}

题解:这次是利用链表的翻转,先中-右-左遍历,再翻转过来

part03 层序遍历

3.1 二叉树的层序遍历

题目链接:102.二叉树的层序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root==null)
            return result;

        Queue<TreeNode> que = new LinkedList<>();
        int len = 0;
        que.add(root);
        while(!que.isEmpty()){
            len = que.size();
            List<Integer> q = new ArrayList<>();
            while(len>0){
                TreeNode cur = que.poll();
                if(cur.left!=null)que.add(cur.left);
                if(cur.right!=null)que.add(cur.right);
                q.add(cur.val);
                len--;
            }
            result.add(q);
        }

        return result;
    }
}

3.2 二叉树的层序遍历II

题目链接:102.二叉树的层序遍历II

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root==null)
            return result;

        Queue<TreeNode> que = new LinkedList<>();
        que.add(root);
        int len = 0;
        while(!que.isEmpty()){
            len = que.size();
            List<Integer> q = new ArrayList<>();
            while(len>0){
                TreeNode node = que.poll();
                if(node.left!=null)que.add(node.left);
                if(node.right!=null)que.add(node.right);
                q.add(node.val);
                len--;
            }
            result.add(q);
        }
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        for(int i = result.size()-1;i>=0;i--){
            list.add(result.get(i));
        }

        return list;
    }
}

3.3 二叉树的右视图

题目链接:199.二叉树的右视图

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root==null)
            return result;

        Queue<TreeNode> que = new LinkedList<>();
        que.add(root);
        int len = 0;
        while(!que.isEmpty()){
            len = que.size();
            while(len>0){
                TreeNode node = que.poll();
                if(node.left!=null)que.add(node.left);
                if(node.right!=null)que.add(node.right);
                if(len==1)
                    result.add(node.val);
                len--;
            }
        }

        return result;
    }
}

归纳

获取双重链表的第一层

java 复制代码
result.get(i)
相关推荐
身如柳絮随风扬20 小时前
Java中的CAS机制详解
java·开发语言
-dzk-21 小时前
【代码随想录】LC 59.螺旋矩阵 II
c++·线性代数·算法·矩阵·模拟
风筝在晴天搁浅21 小时前
hot100 78.子集
java·算法
Jasmine_llq21 小时前
《P4587 [FJOI2016] 神秘数》
算法·倍增思想·稀疏表(st 表)·前缀和数组(解决静态区间和查询·st表核心实现高效预处理和查询·预处理优化(提前计算所需信息·快速io提升大规模数据读写效率
超级大只老咪1 天前
快速进制转换
笔记·算法
m0_706653231 天前
C++编译期数组操作
开发语言·c++·算法
故事和你911 天前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
qq_423233901 天前
C++与Python混合编程实战
开发语言·c++·算法
TracyCoder1231 天前
LeetCode Hot100(19/100)——206. 反转链表
算法·leetcode
m0_715575341 天前
分布式任务调度系统
开发语言·c++·算法