✿-15例题 二叉树--二叉树的先序遍历-144

Posted on 2020-11-13 13:14  MissRong  阅读(200)  评论(0)    收藏  举报

✿-15例题 二叉树-144-二叉树的先序遍历

一、题目

 二、Java实现

添加的依赖-Lombok

复制代码
    <dependencies>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.16.10</version>
      </dependency>
    </dependencies>
复制代码

1.递归方法

复制代码
package shuJuJieGou;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

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

/**
 * @Author : ASUS and xinrong
 * @Version : 2020/10/22 & 1.0
 *
 * 二叉树的中序遍历-94
 * 解法(一)递归
 */

public class ErChaShu_ZhongXuBianLi_DiGui {
    /**
     * 自定义数据类
     */
    @NoArgsConstructor
    @AllArgsConstructor
    public static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) {
            this.val = val;
        }
    }
    static public List<Integer> inorderTraversal(TreeNode root) {
        //定义一个动态数组--用来存放遍历过的节点顺序
        List<Integer> resArray = new ArrayList<>();
        //自定义方法--inorder(当前的树,遍历完的节点)
        inorder(root, resArray);
        return resArray;
    }

    /**
     * 根据当前根节点进行中序遍历
     * @param root  当前的树
     * @param resArray  遍历完的节点
     */
    static public void inorder(TreeNode root, List<Integer> resArray) {
        //不停地遍历下去,直到不再存在根节点(所有的节点都遍历完了)
        if (root == null) {
            return;
        }
        //从左子树开始遍历
        inorder(root.left,resArray);
        //接着遍历根节点
        resArray.add(root.val);
        //最后遍历右子树
        inorder(root.right,resArray);
    }

    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode();
        treeNode.val = 1;
        treeNode.left=null;
        treeNode.right=new TreeNode(2,new TreeNode(3),null);
        List<Integer> inorder = inorderTraversal(treeNode);
        System.out.println(inorder);
    }
    /**
     * 复杂度分析:
     *
     * 时间复杂度:O(n),其中 nn 为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。
     * 空间复杂度:O(n)。空间复杂度取决于递归的栈深度,而栈深度在二叉树为一条链的情况下会达到 O(n)的级别。
     */
}
复制代码

2.迭代方法

复制代码
package shuJuJieGou;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

/**
 * @Author : ASUS and xinrong
 * @Version : 2020/10/27 & 1.0
 * 二叉树先序遍历-迭代实现
 */
public class ErChaShu_XianXuBianLi_DieDai {
    public static List<Integer> preorderTraversal(ErChaShu_XianXuBianLi_DiGui.TreeNode root) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        //创建栈
        Deque<ErChaShu_XianXuBianLi_DiGui.TreeNode> deque = new LinkedList<>();
        //当还有结点未遍历到或者栈内还存有数据时
        while (root!=null||!deque.isEmpty()){
            //当前根结点还有左子树/右子树时
            while (root!=null){
                //因为是直接从根结点开始遍历,所以直接将根结点加入到访问元组中
                arrayList.add(root.val);
                //入栈
                deque.push(root);
                //不断地往下找当前结点的左子树,直到叶子结点
                root = root.left;
            }
            //出栈-后进先出
            ErChaShu_XianXuBianLi_DiGui.TreeNode treeNode = deque.pop();
            //然后对于出栈后的树再遍历其右子树
            root=treeNode.right;
        }
        return arrayList;
    }
    public static void main(String[] args) {
        ErChaShu_XianXuBianLi_DiGui.TreeNode treeNode = new ErChaShu_XianXuBianLi_DiGui.TreeNode();
        treeNode.val=1;
        treeNode.left=null;
        treeNode.right = new ErChaShu_XianXuBianLi_DiGui.TreeNode(2, new ErChaShu_XianXuBianLi_DiGui.TreeNode(3), null);
        List<Integer> preorderList = preorderTraversal(treeNode);
        System.out.println(preorderList);
    }
}
复制代码

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3