辛星Java树算法教程第一篇:树的前序遍历(递归方式与非递归方式)

二叉树的深度优先遍历分为三种:
(1).前序遍历,即先遍历根节点,然后遍历左子树,最后遍历右子树。
(2).中序遍历,即先遍历左子树,然后遍历根节点,最后遍历右子树。
(3).后续遍历,即先遍历左子树,然后遍历右子树,最后遍历根节点。

递归的实现方式就比较简单了,对于如下的二叉树:

                A
              /    \
             B      C
            / \      \
           D  E      F

我们的前序遍历结果就是:
ABDECF

我们先来给出一个使用递归的遍历吧:

package com.mengzhidu.teach.algorithm.tree.demo.traversal;

import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;

/**
 * 这里采用递归的方式来进行前序遍历
 * Created by xinxing on 2019/3/20
 */
public class PreOrderDemo1 {

    public static void main(String[] args) {
        preOrder(TreeNodeHelper.getTreeNode());
    }


    private static void preOrder(TreeNode treeNode) {
        if (treeNode == null) {
            return;
        }
        System.out.println(treeNode.getValue());
        preOrder(treeNode.getLeft());
        preOrder(treeNode.getRight());
    }
}

然后我们给出前序遍历的非递归实现,其实也比较简单。
因为凡是可以用递归实现的,都可以用栈来实现。
我们只需要稍加改造即可:

package com.mengzhidu.teach.algorithm.tree.demo.traversal;

import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;

import java.util.Stack;

/**
 * Created by xinxing on 2019/3/20
 * 非递归的方式来实现树的遍历
 */
public class PreOrderDemo2 {

    public static void main(String[] args) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode root = TreeNodeHelper.getTreeNode();
        stack.push(root);
        while (!stack.empty()) {
            TreeNode tmp = stack.pop();
            if (tmp == null) {
                continue;
            }
            System.out.println(tmp.getValue());
            stack.push(tmp.getRight());
            stack.push(tmp.getLeft());

        }
    }
}

对于树的前序遍历,就介绍到这里啦。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值