二叉树遍历

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {
        Tree tree = new Tree("G");
        tree.left = new Tree("D");
        tree.right = new Tree("M");
        tree.left.left = new Tree("A");
        tree.left.right = new Tree("F");
        tree.left.right.left = new Tree("E");
        tree.right.left = new Tree("H");
        tree.right.right = new Tree("Z");
//        前序中序后序
//        GDAFEMHZ
//        ADEFGHMZ
//        AEFDHZMG
//        递归
        qianxuDiGui(tree);
        System.out.println();
        zhongxuDiGui(tree);
        System.out.println();
        houxuDigui(tree);
        System.out.println();
        System.out.println("---------------");
//        非递归
        qianxu(tree);
        System.out.println();
        zhongxu(tree);
        System.out.println();
        houxu(tree);
        System.out.println();
        System.out.println("---------------");

//        层序
//        GDMAFHZE
        middleOrder(tree);
    }

    private static void qianxuDiGui(Tree node){
        if (node == null){
            return;
        }
        System.out.print(node.val);
        qianxuDiGui(node.left);
        qianxuDiGui(node.right);
    }

    private static void zhongxuDiGui(Tree node){
        if (node == null){
            return;
        }
        zhongxuDiGui(node.left);
        System.out.print(node.val);
        zhongxuDiGui(node.right);
    }

    private static void houxuDigui(Tree node){
        if (node == null){
            return;
        }
        houxuDigui(node.left);
        houxuDigui(node.right);
        System.out.print(node.val);
    }

    private static void qianxu(Tree tree) {
        Stack<Tree> stack = new Stack<>();
        Tree node = tree;
        while (node != null || stack.size() != 0) {
            if (node != null) {
                stack.push(node);
                System.out.print(node.val);
                node = node.left;
            } else {
                node = stack.pop().right;
            }
        }
    }

    private static void zhongxu(Tree node) {
        Stack<Tree> stack = new Stack<>();
        Tree tree = node;
        while (tree != null || stack.size() != 0) {
            if (tree != null) {
                stack.push(tree);
                tree = tree.left;
            } else {
                tree = stack.pop();
                System.out.print(tree.val);
                tree = tree.right;
            }
        }
    }

    private static void houxu(Tree node) {
        if (node == null) {
            return;
        }
        Stack<Tree> stack = new Stack<>();
        Stack<Boolean> stackFlag = new Stack<>();
        Tree tree = node;
        while (stack.size() != 0 || tree != null) {
            while (tree != null) {
                stack.push(tree);
                stackFlag.push(false);
                tree = tree.left;
            }
//            从右子树返回
            while (stack.size() != 0 && stackFlag.peek()){
                stackFlag.pop();
                System.out.print(stack.pop().val);
            }
//            从左子树返回
            if (stack.size() != 0 && !stackFlag.peek()){
                stackFlag.pop();
                stackFlag.push(true);
                tree=stack.peek().right;
            }
        }
    }

        private static void middleOrder(Tree tree){
        Queue<Tree> queue = new LinkedList<>();
        queue.offer(tree);
        while (queue.size() != 0){
            tree = queue.poll();
            if (tree.left != null){
                queue.offer(tree.left);
            }
            if (tree.right != null){
                queue.offer(tree.right);
            }
            System.out.print(tree.val);
        }
    }
}

class Tree {
    Tree left;
    Tree right;
    String val;

    public Tree(String val) {
        this.val = val;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值