二叉树的前序遍历/中序遍历

二叉树的前序遍历

前序遍历,即逻辑是根节点-----左节点-----右节点
这里分为递归方式和非递归方式

递归方式

/**
 * 节点定义
 */
public static class Tree {

    Tree left;
    Tree right;
    int val;

    public Tree(int val) {
        this.val = val;
    }
}

/**
 * 递归的先序遍历
 */
public static void preTraversing(Tree root) {
    // 1.判空
    if (root == null) {
        return;
    }
    // 输出根节点
    System.out.print(root.val + " ");
    // 2.递归左节点
    preTraversing(root.left);
    // 3. 递归右节点
    preTraversing(root.right);
}

非递归方式

思路: 其实非递归,则通过栈来实现,递归的过程我们可以理解为不断的入栈和不断的出栈的过程。
代码中的思路步骤已经写的很清楚了;

/**
 * 非递归的先序遍历
 *
 * @param root
 */
public static void preTraversing1(Tree root) {
    // 1.判空
    if (root == null) {
        return;
    }
    // 2.定义栈,并把树压入栈中
    LinkedList<Tree> stack = new LinkedList<>();
    stack.push(root);
    // 3.判断栈是否为空
    while (!stack.isEmpty()) {
        // 4.弹出栈中元素
        Tree currentTree = stack.pop();
        // 5.先输出根节点的值
        System.out.print(currentTree.val + " ");
        // 6.先将右节点压入栈中,因为栈的特性,先入后出,所以压入右,在压入左,则先弹出的是左
        if (currentTree.right != null) {
            stack.push(currentTree.right);
        }
        // 7.压入左节点
        if (currentTree.left != null) {
            stack.push(currentTree.left);
        }
    }
}

二叉树的中序遍历

中序遍历的逻辑是: 左节点------根节点----右节点
同样有递归方式和非递归方式

递归方式

/**
 * 递归的中序遍历: 左节点-跟节点-右节点
 */
public static void midTraversing(Tree root) {
    // 1.判空
    if (root == null) {
        return;
    }
    // 2.递归左节点
    preTraversing(root.left);
    // 输出根节点
    System.out.print(root.val + " ");
    // 3. 递归右节点
    preTraversing(root.right);
}

非递归方式

/**
 *  非递归方式的中序遍历
 * @param root
 */
public static void midTraversing1(Tree root) {
    // 1.判空
    if (root == null) {
        return;
    }
    // 2.定义栈
    LinkedList<Tree> stack = new LinkedList<>();
    Tree currentNode = root;
    while (currentNode!=null ||  !stack.isEmpty()) {
        // 3.遍历出左子树中额所有左节点,压入栈中
        while (currentNode!=null) {
            stack.push(currentNode);
            currentNode = currentNode.left;
        }
        // 3.弹出栈,并输出
        currentNode = stack.pop();
        System.out.print(currentNode.val+" ");
        currentNode = currentNode.right;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值