双非本科准备秋招(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;
    }
}
相关推荐
Rnan-prince2 分钟前
LeetCode 股票买卖系列:一个动态规划状态机模板通吃四题
leetcode·动态规划
如意猴7 分钟前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i10 分钟前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
可乐鸡翅yeah_17 分钟前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
圣保罗的大教堂36 分钟前
leetcode 3756. 连接非零数字并乘以其数字和 II 中等
leetcode
专业程序开发源1 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户094248568031 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
樱花落木兰1 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
HAHAXX81 小时前
电商RPA批量上架通用方案:一套流程如何同时跑通拼多多、抖店、淘宝和跨境平台
java·运维·rpa