双非本科准备秋招(15.3)—— 力扣二叉树

今天学了二叉树结点表示法,建树代码如下。

java 复制代码
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    @Override
    public String toString() {
        return String.valueOf(val);
    }
}

我们建一棵树,然后使用递归的方式前中后序遍历(preOrder、inOrder、postOrder),再使用非递归方式遍历(traversal)。

java 复制代码
public class Test {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(
                1,
                new TreeNode(2, new TreeNode(4, null, null), null),
                new TreeNode(3, new TreeNode(5, null, null), new TreeNode(6, null, null))
        );

        preOrder(root);
        inOrder(root);
        postOrder(root);

        traversal(root);
    }

建的树如下:

递归深度遍历:

java 复制代码
/**
     * 前序
     */
    public static void preOrder(TreeNode t){
        if(t == null) return;
        System.out.println(t.val);
        preOrder(t.left);
        preOrder(t.right);
    }

    /**
     * 中序
     */
    public static void inOrder(TreeNode t){
        if(t == null) return;
        inOrder(t.left);
        System.out.println(t.val);
        inOrder(t.right);
    }

    /**
     * 后序
     */
    public static void postOrder(TreeNode t){
        if(t == null) return;
        postOrder(t.left);
        postOrder(t.right);
        System.out.println(t.val);
    }

非递归的方式

使用以下代码可以通用前中后序的遍历。

java 复制代码
    /**
     * 一套代码通用遍历,改造后序遍历
     */
    public static void traversal(TreeNode t){
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode pop = null;
        while(t != null || !stack.isEmpty()){
            if(t != null){
                //左子树还没处理
                System.out.println("前序: " + t.val);
                stack.push(t);
                t = t.left;
            }
            else{
                TreeNode peek = stack.peek();
                if(peek.right == null){
                    //右子树为空
                    System.out.println("中序: " + peek.val);
                    pop = stack.pop();
                    System.out.println("后序: " + pop.val);
                }
                else if(peek.right == pop){
                    //右子树处理完成
                    pop = stack.pop();
                    System.out.println("后序: " + pop.val);
                }
                else{
                    //右子树还没处理
                    System.out.println("中序: " + peek.val);
                    t = peek.right;
                }
            }
        }
    }

使用以上知识解决如下题目:

1、144. 二叉树的前序遍历

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode pop = null;
        while(root != null || !stack.isEmpty()){
            if(root != null){
                list.add(root.val);
                stack.push(root);
                root = root.left;
            }
            else{
                TreeNode peek = stack.peek();
                if(peek.right == null || peek.right == pop){
                    pop = stack.pop();
                }
                else{
                    root = peek.right;
                }
            }
        }
        return list;
    }
}

2、94. 二叉树的中序遍历

java 复制代码
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode pop = null;
        while(root != null || !stack.isEmpty()){
            if(root != null){
                stack.push(root);
                root = root.left;
            }
            else{
                TreeNode peek = stack.peek();
                if(peek.right == null){
                    list.add(peek.val);
                    pop = stack.pop();
                }
                else if(peek.right == pop){
                    pop = stack.pop();
                }
                else{
                    list.add(peek.val);
                    root = peek.right;
                }
            }
        }
        return list;
    }
}

3、145. 二叉树的后序遍历

java 复制代码
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        TreeNode pop = null;
        while(root != null || !stack.isEmpty()){
            if(root != null){
                stack.push(root);
                root = root.left;
            }
            else{
                TreeNode peek = stack.peek();
                if(peek.right == null || peek.right == pop){
                    pop = stack.pop();
                    list.add(peek.val);
                }
                else{
                    root = peek.right;
                }
            }
        }
        return list;
    }
}
相关推荐
程序员小假3 分钟前
HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·后端
Mr数据杨5 分钟前
【Codex】用教案主体模块沉淀标准化教学设计内容
java·开发语言·django·codex·项目开发
NorburyL5 分钟前
DPO笔记
深度学习·算法
苍煜12 分钟前
RocketMQ系列第三篇:Java原生基础使用实操,手把手写生产者消费者Demo
java·rocketmq·java-rocketmq
老纪的技术唠嗑局16 分钟前
深度解析 LLM Wiki / Obsidian-Wiki / GBrain:Agent 时代知识的“自组织”与“自进化”
大数据·数据库·人工智能·算法
Andya_net1 小时前
Java | Java内存模型JMM
java·开发语言
182******20831 小时前
2026年java后端还有机会吗?还能找到工作吗?
java·开发语言
XS0301061 小时前
Java基础 map集合
java·哈希算法·散列表
凤山老林2 小时前
从0到1搭建企业级权限管理系统:Spring Boot + JWT + RBAC实战指南
java·spring boot·后端·权限管理·rbac
逍遥德2 小时前
AI时代,计算机专业大学生学习指南
java·javascript·人工智能·学习·ai编程