【随想】每日两题Day.21

目录

1.二叉树的递归遍历

前序:

后序:

中序:

思路:

2.二叉树的迭代遍历

前序:

思路:

后序:

思路:

中序:

思路:


1.二叉树的递归遍历

前序:

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        preorder(root,list);
        return list;
    }
    public void preorder(TreeNode root,List<Integer> list) {
        if(root == null) return;
        list.add(root.val);
        preorder(root.left,list);
        preorder(root.right,list);
    }
}

后序:

java 复制代码
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        postorder(root,list);
        return list;
    }
    public void postorder(TreeNode root,List<Integer> list) {
        if(root == null) return;
        postorder(root.left,list);
        postorder(root.right,list);
        list.add(root.val);
    }
}

中序:

java 复制代码
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        inorder(root,list);
        return list;
    }
    public void inorder(TreeNode root,List<Integer> list) {
        if(root == null) return;
        inorder(root.left,list);
        list.add(root.val);
        inorder(root.right,list);
    }
}
思路:

递归实现二叉树遍历还是很简单的。

2.二叉树的迭代遍历

前序:

java 复制代码
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root != null) stack.push(root);
        while(!stack.empty()) {
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.right != null) stack.push(node.right);
            if(node.left != null) stack.push(node.left);
        }
        return list;
    }
}
思路:

我们利用入栈结点,然后出栈时将数值存入结果数组,然后要入栈此节点的孩子结点。由于前序遍历:根 左 右

由于栈是先进后出,所以我们要先入栈右结点,后入栈左节点

后序:

java 复制代码
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root != null) stack.push(root);
        while(!stack.empty()) {
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.left != null) stack.push(node.left);
            if(node.right != null) stack.push(node.right);
        }
        Collections.reverse(list);
        return list;
    }
}
思路:

根据前序遍历的特点:根 左 右

后序遍历的特点: 左 右 根

所以将左 右 入栈的顺序颠倒后,再将结果数组reverse,就完成了后序遍历的迭代

中序:

java 复制代码
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;
    }
}
思路:

中序遍历的迭代与前序后序不同,因为他是左 根 右 ,所以不是遍历到就存储的。

我们用栈存储我们遍历过的结点,用来我们回溯,当cur一直向左直到为null时,我们回溯

将cur指向出栈的结点,然后加入到结果数组,再将cur指向cur.right

直到cur和stack都为空时跳出循环。

相关推荐
w***744021 分钟前
SQL Server2022版详细安装教程(Windows)
windows
S***26752 小时前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
汤姆yu2 小时前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
Yue丶越2 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
马剑威(威哥爱编程)2 小时前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL2 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
翔云 OCR API2 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
小白程序员成长日记3 小时前
2025.11.24 力扣每日一题
算法·leetcode·职场和发展
有一个好名字3 小时前
LeetCode跳跃游戏:思路与题解全解析
算法·leetcode·游戏
V***u4533 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言