【编程题 递归+非递归】BM24 二叉树的前序遍历(详细注释 易懂)

题目描述

题目链接:二叉树的前序遍历_牛客题霸_牛客网 (nowcoder.com)

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

数据范围:二叉树的节点数量满足 0 \le n \le 100 \0≤n≤100  ,二叉树节点的值满足 1 \le val \le 100 \1≤val≤100  ,树的各节点的值各不相同

示例 1:

示例1

输入:

{1,#,2,3}

返回值:

[1,2,3]

题目解读:

   说到二叉树的前序遍历,很多人应该闭着眼睛也能做出来,确实,递归形式的二叉树遍历太简单了。但是如果面试官让你写非递归的呢,如果没有准备过,还是有点点难度的。

解题思想:

         前序遍历就是 左 右根  ,它的非递归,就是先把根节点入栈,然后弹出,弹出之后就访问val 值,然后先添加右子树,再添加左子树,然后再弹出左子树,添加左子树的左子树 和右子树,直到栈为空,应该说,前序遍历的非递归和递归是非常相似的。 只是有几点需要注意 一个是,前序遍历 是在进入循环前 把根节点入栈,循环的判断条件也没有 判定根节点是否为空这一约束,所以需要单独判断,根节点是否为空。还有就是 ,每次加入当前节点的左子树和右子树都需要判空,非空才能加入栈。  

代码注释(递归):

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) {
        // write code here
        ArrayList<Integer> list = new ArrayList<>();
        preorder(list,root);
        int[] arr = new int[list.size()];
        for(int i=0;i< list.size();i++){
            arr[i] = list.get(i);
        }
        return arr;
    }
    public void preorder(ArrayList<Integer> list,TreeNode root){
        if(root == null)
            return;
        list.add(root.val);
        preorder(list,root.left);
        preorder(list,root.right);
    }
}

代码注释(非递归):

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) {
        // write code here
        // 单独进行根节点的判空
        if(root == null)
            return new int[0];
        ArrayList<Integer> list = new ArrayList<>();
         Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.right!=null)
            stack.push(node.right);
            if(node.left != null)
            stack.push(node.left);
        }
        
        int[] arr = new int[list.size()];
        for(int i=0;i< list.size();i++){
            arr[i] = list.get(i);
        }
        return arr;
    }
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值