二叉树先序遍历(递归+迭代)——java

目录

 

一、题目

二、先序遍历讲解

三、先序遍历递归法实现(详解+代码)

1、递归实现讲解:

 2、代码实现:

四、先序遍历迭代法实现(详解+代码)

1、迭代法实现讲解

2、具体代码实现 


 

一、题目

leetcode链接:二叉树的前序遍历 - 力扣 (LeetCode)

 

内容:

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

示例 1:

259d00b25210b33365e576b786d4e3b1.png

输入:root = [1,null,2,3]
输出:[1,2,3]

二、先序遍历讲解

(1)下图先序遍历结果:

        图1-1:1--2--5--3--7

        图1-2:1--2--5--6--3--7

(2)遍历顺序:中左右

c343dd8a260a4c32bf027c296dc4e16c.png

                                  图1-1   

5da85aa9c63b4c9eb024e6966810ca30.png

                              图1-2                          

三、先序遍历递归法实现(详解+代码)

1、递归实现讲解:

(1)确定递归放回值以及参数:根据题目需要返回遍历的节点,所以需要List集合存储节点的值,同时需要将二叉树头节点传入;

preorder(TreeeNode root,List<Integer> result)

(2)确定递归终止条件:遍历二叉树节点为空,表明已经无节点,直接return

if(node==null)
    return;

(3)确定递归逻辑:递归顺序为中,左,右,递归开始时,先将根节点添加List集合,然后遍历左子树,最后遍历右子树。

result.add(treeNode.val);//中
preorder(treeNode.left,result); //左
preorder(treeNode.right,result); //右

 2、代码实现:

Class test{
     public static void preorder(TreeNode treeNode, List<Integer> result){
        if (treeNode==null){
            return;
        }
        result.add(treeNode.val);//中
        preorder(treeNode.left,result); //左
        preorder(treeNode.right,result); //右
    }

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        preorder(root,result);
        return result;
    }
}

四、先序遍历迭代法实现(详解+代码)

1、迭代法实现讲解

(1)迭代法可以借助栈来进行遍历,栈的结构是后进先出,先进后出;

(2)迭代遍历流程如下:

  ①首先将头节点压入栈,以栈是否为空作为循环条件;

cf6adb4afc0646dab225b266664f6be2.png

  ② 栈不为空,弹出栈顶元素添加到集合list,判断右子树是否为空,不为空入栈,判断左子树是否为空,不为空入栈;

c1df421f44c3401485d7d469eb473790.png

 

 

74bd260fa5c043a58b217d643e069078.png

 

fc43f0f46f1341f5b5fcc2e2586c735a.png

3a93b91813524e2b883dc563a945a87a.png

2、具体代码实现 

    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null)
            return list;
        
        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);
        }
        return list;
    }

 

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swttws.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值