题解 | #二叉树的前序遍历#

二叉树的前序遍历

https://www.nowcoder.com/practice/5e2135f4d2b14eb8a5b06fab4c938635

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public void preorder(List<Integer> list,TreeNode root){
        if(root==null){
            return ;
        }
        list.add(root.val);
        preorder(list,root.left);
        preorder(list,root.right);
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] preorderTraversal (TreeNode root) {
        // write code here
        List<Integer> list = new ArrayList<>();
        preorder(list,root);
        int[] res = new int[list.size()];
        for(int i=0;i<list.size();++i){
            res[i]=list.get(i);
        }
        return res;
    }
}

方法一:递归

由于对于每个树的左右子树问题都是进行前序遍历,所以可用递归实现。另外需要数组存储遍历结果而且随着递归发生变化,所以将数组作为参数传递,另外一个参数当然是树根节点。参数与题中给出的方法不同,因此需要另设方法实现递归。主方法要求返回int类型的数组,所以要将List中的值复制给一个int型数组。

递归三要素:

1、递归出口:访问到叶子节点后,左右孩子为空,则判空即为出口条件。

2、当前任务:访问当前节点,将值存入数组。

3、向下递归:先从左子树递归,再从右子树递归。

记Java 数组List的用法:

1、声明:List<类型> list = new ArrayList<>();

2、添加元素:list.add(值);

3、访问:list.get(下标);

方法二:用栈,模拟递归

利用栈的先进后出特性,模拟递归,父问题先进入子问题再进入。由于是先序遍历即 根左右 ,所以入栈为先右子树后左子树。开始先让根节点入栈,循环条件是栈不为空,循环内先访问当前栈顶结点,然后右子树若存在则入栈,左子树若存在再入栈。最后所有结点访问完栈为空,跳出循环,给数组赋值后返回即可。

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型一维数组
     */
    public int[] preorderTraversal (TreeNode root) {
        //空树返回空数组
        if(root==null){
            return new int[0];
        }
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> s = new Stack<TreeNode>();
        s.push(root);
	  //遍历
        while(!s.empty()){
            TreeNode node = s.pop();
            list.add(node.val);
            if(node.right!=null){
                s.push(node.right);
            }
            if(node.left!=null){
                s.push(node.left);
            }
        }
        int[] res = new int[list.size()];
        for(int i=0;i<list.size();++i){
            res[i]=list.get(i);
        }
        return res;

    }
}
全部评论

相关推荐

用微笑面对困难:这里面最强的是驾驶证了,可以入职美团大厂,然后直接开启黄马褂人生
点赞 评论 收藏
分享
09-01 21:40
已编辑
同济大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务