数据结构和算法--二叉树遍历

package com.zwz.treeNode;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 * 二叉树遍历
 */
public class TreeNodeService {

    static TreeNode setTreeNode(){
        TreeNode treeNode = new TreeNode(1,
                new TreeNode(2,
                        new TreeNode(4, null, null),
                        null),
                new TreeNode(3,
                        new TreeNode(5, null, null),
                        new TreeNode(6, null, null)));
        return treeNode;
    }
    /**
     * 前序遍历
     * 先访问一个节点
     * 然后访问左树
     * 再访问右树
     */
    public static void preOrder(TreeNode treeNode){
        if(treeNode == null){
            return;
        }
        System.out.print(treeNode.val+" ");
        preOrder(treeNode.left);
        preOrder(treeNode.right);
    }
    /**
     * 中序遍历
     * 先访问左树
     * 然后访问一个节点
     * 再访问右树
     */
    public static void inOrder(TreeNode treeNode){
        if(treeNode == null){
            return;
        }
        inOrder(treeNode.left);
        System.out.print(treeNode.val+" ");
        inOrder(treeNode.right);
    }

    /**
     * 后序遍历
     * 先访问左树
     * 再访问右树
     * 先访问一个节点
     */
    public static void postOrder(TreeNode treeNode){
        if(treeNode == null){
            return;
        }
        postOrder(treeNode.left);
        postOrder(treeNode.right);
        System.out.print(treeNode.val+" ");
    }

    /**
     * 非递归遍历
     * 使用栈 记录遍历路径
     * 前中序遍历
     */
    public static void setStock(TreeNode treeNode){
        LinkedList<TreeNode> stock = new LinkedList<>();
        while (treeNode != null || !stock.isEmpty()){
            if(treeNode != null){
                System.out.println("前:"+treeNode.val);
                stock.push(treeNode);
                treeNode = treeNode.left;
            }else{
                TreeNode poll = stock.pop();
                System.err.println("中:"+poll.val);
                treeNode = poll.right;
            }
        }

    }

    /**
     * 非递归遍历
     * 使用栈 记录遍历路径
     * 后续遍历
     */
    public static void setStockPost(TreeNode treeNode){
        LinkedList<TreeNode> stock = new LinkedList<>();
        TreeNode poll = null;
        while (treeNode != null || !stock.isEmpty()){
            if(treeNode != null){
                stock.push(treeNode);
                treeNode = treeNode.left;
            }else{
                //此处用栈顶元素的右节点比较是否处理过
                TreeNode peek = stock.peek();
                if(peek.right == null || peek.right == poll){
                    poll = stock.pop();
                    System.out.println("后:"+poll.val);
                }else{
                    treeNode = peek.right;
                }
            }
        }

    }


    public static void main(String[] args) {
        TreeNode treeNode = setTreeNode();
        preOrder(treeNode);
        System.out.println();
        inOrder(treeNode);
        System.out.println();
        postOrder(treeNode);
        System.out.println("");
        System.out.println("=================");
        //setStock(treeNode);
        setStockPost(treeNode);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值