LeetCode每日刷题Day12---L589N叉树的前序遍历、L590N叉树的后序遍历

L589N叉树的前序遍历

GitHub 账户:LuvnJoae  欢迎关注! https://github.com/LuvnJoae
GitHub 代码链接:https://github.com/LuvnJoae/Java_leetcode

思路和结果

在这里插入图片描述

代码思路1

package Day12_5_29.L589;

import java.util.ArrayList;
import java.util.List;

class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val,List<Node> _children) {
        val = _val;
        children = _children;
    }
}

/**
 * 思路1
 1. 采用递归思路
 a. 前序遍历,先根节点的值,再从左到右遍历
 2. 先定义一个ArrayList
 3. 在方法内
 a. 如果,节点不为空
 i. 先添加这个节点的值
 ii. 再遍历该节点的子树(顺序),递归调用本方法
 b. 最后返回list

 */
public class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    public List<Integer> preorder(Node root) {
        if (root != null){
            list.add(root.val);
            for (Node child : root.children) {
                preorder(child);
            }
        }
        return list;
    }
}

代码思路2

package Day12_5_29.L589;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 *     1. 采用迭代法,借助 栈 来储存节点,节点按照前序的顺序出入栈
 2. 定义一个ArrayList和栈Stack
 3. 如果节点为空,返回list
 4. 将根节点入栈
 5. while循环,栈空时退出循环
 a. 出栈一个节点,为node节点
 b. 将该节点的值添加到list
 c. 循环,反方向遍历node的子节点
 i. 将子节点入栈(这个入栈顺序,出来后,就是前序遍历)
 6. 返回list

 */
public class Solution2 {
    public List<Integer> preorder(Node root) {

        ArrayList<Integer> list = new ArrayList<>();
        if (root == null) return list;

        Stack<Node> s = new Stack<>();
        s.push(root);
        while (!s.isEmpty()){
            Node n = s.pop();
            list.add(n.val);
            for (int i = n.children.size()-1 ; i >= 0; i--){
                s.push(n.children.get(i));
            }
        }
        return list;
    }
}

L590N叉树的后序遍历

思路和结果

在这里插入图片描述

代码思路1

package Day12_5_29.L590;

import java.util.ArrayList;
import java.util.List;

class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val,List<Node> _children) {
        val = _val;
        children = _children;
    }
}
/**
 * 思路1
 1. 采用递归思路
 a. 后序遍历,先遍历从左到右的子树,最后输出根节点值
 2. 先定义一个ArrayList
 3. 在方法内
 a. 如果,节点不为空
 i. 先遍历该节点的子树(顺序),递归调用本方法
 ii. 再添加这个节点的值
 b. 最后返回list

 */
public class Solution {
    ArrayList<Integer> list = new ArrayList<>();

    public List<Integer> postorder(Node root) {
        if (root != null){
            for (Node child : root.children) {
                postorder(child);
            }
            list.add(root.val);
        }
        return list;

    }
}

代码思路2

package Day12_5_29.L590;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 思路2
 1. 采用迭代法,借助 栈 来储存节点,节点按照后序的顺序出入栈
 2. 定义一个ArrayList和栈Stack
 3. 如果节点为空,返回list
 4. 将根节点入栈
 5. 定义一个 node ,作为每次迭代的节点,初始值赋为root
 6. 再定义一个Node  child ,作为存储每次迭代后的子节点(用来判断是否已经遍历过该节点的子节点),初始值赋为null
 7. while循环,栈为空时退出循环
 a. 如果 当前节点 有子节点(size>0) 并且 不包括child节点 (排除已遍历过的)
 i. 循环,反方向遍历 node 节点的子节点
 ii. 循环完成后,将node节点指向当前栈的栈顶
 b. 否则 (代表当前节点已经没有子节点了,要么是最下层,要么就是没有子节点的节点,这时的操作就是将这一层的子节点从左向右的添加到list,添加完成后,栈顶的值就是上一层节点的了,相当于后序遍历)
 i. 将栈顶节点出栈给 child (此时栈顶节点就是 子节点 的最左边的节点)
 ii. 添加此节点的值给list
 iii. 如果此时栈为空,那么break结束循环。
 iv. 否恶则,node等于当前栈顶的值

 */
public class Solution2 {
    public List<Integer> postorder(Node root) {

        ArrayList<Integer> list = new ArrayList<>();
        if (root == null) return list;
        Stack<Node> s = new Stack<>();
        s.push(root);
        Node node = root;
        Node child = null;
        while (!s.isEmpty()){
            if ( node.children.size() > 0&& !node.children.contains(child) ){
                for ( int i = node.children.size() - 1; i >= 0 ; i--){
                    s.push(node.children.get(i));
                }
                node = s.peek();
            }else {
                child = s.pop();
                list.add(child.val);
                if (s.isEmpty()) break;
                node = s.peek();
            }
        }
        return list;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值