✿-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); } }