二叉树前序后序中序遍历

二叉树前序后序中序遍历

创建二叉树代码

private static class TreeNode {
    public final int value;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int value) {
        this.value = value;
    }
}

public static TreeNode createTree(int[] treeArr) {
    TreeNode[] root = new TreeNode[treeArr.length];
    for (int i = 0; i < treeArr.length; i++) {
        if (treeArr[i] == -1) {
            root[i] = null;
            continue;
        }
        TreeNode node = new TreeNode(treeArr[i]);
        root[i] = node;
        if (i == 0) continue;
        if (i % 2 == 1) {
            //左节点
            root[i / 2].left = node;
        } else {
            root[(i - 1) / 2].right = node;
        }
    }
    return root[0];
}

前序遍历

/**
 * 前序 先根,再左树,再右树
 *
 * @param root
 */
public static void treeForeachFirst(TreeNode root) {
    Queue<TreeNode> stack = new LinkedList<>();
    stack.add(root);
    while (!stack.isEmpty()) {
        TreeNode pop = stack.poll();
        System.out.print(pop.value + " ");
        if (pop.left != null) stack.add(pop.left);
        if (pop.right != null) stack.add(pop.right);
    }
}

中序遍历和后续遍历要用到一个帮助类

private static class HelpTreeNode {
    public final TreeNode realNode;
    public boolean isCheckChild = false;

    public HelpTreeNode(TreeNode realNode) {
        this.realNode = realNode;
    }
}

中序遍历

/**
 * 先左树,再根,再右树
 *
 * @param root
 */
public static void treeForeachMid(TreeNode root) {
    Stack<HelpTreeNode> stack = new Stack<>();
    stack.push(new HelpTreeNode(root));
    while (!stack.isEmpty()) {
        HelpTreeNode pop = stack.pop();
        if (pop.isCheckChild) {
            System.out.print(pop.realNode.value + " ");
        } else {
            if (pop.realNode.right != null) {
                stack.push(new HelpTreeNode(pop.realNode.right));
            }
            stack.push(pop);
            pop.isCheckChild = true;
            if (pop.realNode.left != null) {
                stack.push(new HelpTreeNode(pop.realNode.left));
            }
        }
    }
}

后序遍历

/**
 * 后续遍历,先左树,再右树,再根
 *
 * @param root
 */
public static void treeForeachLast(TreeNode root) {
    Stack<HelpTreeNode> stack = new Stack<>();
    stack.push(new HelpTreeNode(root));
    while (!stack.isEmpty()) {
        HelpTreeNode pop = stack.pop();
        if (pop.isCheckChild) {
            System.out.print(pop.realNode.value + " ");
        } else {
            stack.push(pop);
            if (pop.realNode.right != null) {
                stack.push(new HelpTreeNode(pop.realNode.right));
            }
            pop.isCheckChild = true;
            if (pop.realNode.left != null) {
                stack.push(new HelpTreeNode(pop.realNode.left));
            }
        }
    }
}

运行

public static void main(String[] args) {
    TreeNode tree = createTree(new int[]{1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, 8, 9, -1, 10});
    treeForeachFirst(tree);
    System.out.println();
    treeForeachMid(tree);
    System.out.println();
    treeForeachLast(tree);
}

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值