二叉树的几种遍历方式

package com.sys.binarytreetest.binary;

import java.security.Principal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;

/**
 * Created by chengjiamei on 2017/8/3.
 */

public class BinaryTree {

    private TreeNode root = null;

    public BinaryTree() {
        root = new TreeNode(1,"A");
        createBinaryTree();
    }

    /**
     * Root 的位置
     * 前序遍历 Root Left Right
     * 中序遍历 Left Root Right
     * 后序遍历 Left Right Root
     * 构建二叉树
     *                      A
     *              B                C
     *      D           E               F
     *  G       H   I       J       K       L
     */
    public void createBinaryTree(){

        TreeNode nodeB = new TreeNode(2,"B");
        TreeNode nodeC = new TreeNode(3,"C");
        TreeNode nodeD = new TreeNode(4,"D");
        TreeNode nodeE = new TreeNode(5,"E");
        TreeNode nodeF = new TreeNode(6,"F");
        TreeNode nodeG = new TreeNode(7,"G");
        TreeNode nodeH = new TreeNode(8,"H");
        TreeNode nodeI = new TreeNode(9,"I");
        TreeNode nodeJ = new TreeNode(10,"J");
        TreeNode nodeK = new TreeNode(11,"K");
        TreeNode nodeL = new TreeNode(12,"L");

        root.leftChild = nodeB;
        root.rightChild = nodeC;

        nodeB.leftChild = nodeD;
        nodeB.rightChild = nodeE;

        nodeC.rightChild = nodeF;

        nodeF.leftChild = nodeK;
        nodeF.rightChild = nodeL;

        nodeD.leftChild = nodeG;
        nodeD.rightChild = nodeH;

        nodeE.leftChild = nodeI;
        nodeE.rightChild = nodeJ;

    }

    public int getHeight() {

        return getHeight(root);
    }

    public int getHeight(TreeNode treeNode) {
        if(treeNode == null)
            return 0;
        int i = getHeight(treeNode.leftChild);
        int j = getHeight(treeNode.rightChild);
        return  i<j?j+1:i+1;
    }

    public int getSize(){
        return getSize(root);
    }

    public int getSize(TreeNode treeNode) {
        if(treeNode == null)
            return 0;
        return 1+getSize(treeNode.leftChild) + getSize(treeNode.rightChild);
    }

    /**
     * 迭代遍历
     * 前序遍历
     * @param treeNode
     */
    private  void preOrder(TreeNode treeNode) {
        if(treeNode == null)
            return;
        System.out.println(treeNode.data);
        preOrder(treeNode.leftChild);
        preOrder(treeNode.rightChild);
    }

    /**
     * 栈式 遍历
     * @param node
     */
    private void nonPreOrder(TreeNode node){
        if(node == null)
            return;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(node);
        while (!stack.isEmpty()) {
            TreeNode treeNode = stack.pop();
            System.out.println(treeNode.data);
            if(treeNode.rightChild != null) {
                stack.push(treeNode.rightChild);
            }
            if(treeNode.leftChild != null) {
                stack.push(treeNode.leftChild);
            }

        }
    }

    /**
     * 迭代遍历
     * 中序遍历
     * @param treeNode
     */
    private void midOrder(TreeNode treeNode) {
        if (treeNode == null)
            return;
        midOrder(treeNode.leftChild);
        System.out.println(treeNode.data);
        midOrder(treeNode.rightChild);
    }

    /**
     *  栈式 遍历
     *  中序遍历
     * @param treeNode
     */
    private void nonMidOrder(TreeNode treeNode) {
        if(treeNode == null)
            return;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(treeNode);
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            TreeNode nodeLeft = node.leftChild;
            TreeNode nodeRight = node.rightChild;
            if(nodeRight != null) {
                stack.push(nodeRight);
            }
            if(nodeLeft != null || nodeRight != null){
                node.leftChild = null;
                node.rightChild = null;
                stack.push(node);
            }
            if(nodeLeft != null){
                stack.push(nodeLeft);
            }
            if(nodeLeft == null && nodeRight == null){
                System.out.println(node.data);
            }

        }
    }

    /**
     * 迭代遍历
     * 后序遍历
     * @param treeNode
     */
    public void postOrder(TreeNode treeNode) {
        if(treeNode == null)
            return;

        postOrder(treeNode.leftChild);
        postOrder(treeNode.rightChild);
        System.out.println(treeNode.data);
    }

    /**
     *  栈式 遍历
     *  后序遍历
     * @param treeNode
     */
    public void nonPostOrder(TreeNode treeNode) {
        if (treeNode == null)
            return;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(treeNode);

        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            TreeNode nodeLeft = node.leftChild;
            TreeNode nodeRight = node.rightChild;
            if(nodeLeft != null || nodeRight != null){
                node.leftChild = null;
                node.rightChild = null;
                stack.push(node);
            }
            if(nodeRight != null) {
                stack.push(nodeRight);
            }
            if(nodeLeft != null)
                stack.push(nodeLeft);

            if(nodeLeft == null && nodeRight == null) {
                System.out.println(node.data);
            }

        }
    }

    /**
     * 层序遍历
     * @param node
     */
    private void cengxuOrder(TreeNode node){
        if(node == null)
            return;
        int in = 0;
        int out = 0;
        ArrayList<TreeNode> list = new ArrayList<>();
        list.add(in++,node);
        while (in>out) {
            if(list.get(out) != null){
                System.out.println(list.get(out).data);
                if(node.leftChild != null) {
                    list.add(in++, list.get(out).leftChild);
                }
                if( node.rightChild != null){
                    list.add(in++, list.get(out).rightChild);
            }
            }
            out++;
        }

    }

    private List<TreeNode> getList(TreeNode node) {
        ArrayList<TreeNode> list = new ArrayList<>();
        if(node.leftChild != null) {
            list.add(node.leftChild);
        }
        if(node.rightChild != null){
            list.add(node.rightChild);
        }
        return list;
    }

    public class TreeNode {
        private int index;
        private String data;
        private TreeNode leftChild;
        private TreeNode rightChild;

        public TreeNode(int index, String data ) {
            this.index = index;
            this.data = data;
            this.leftChild = null;
            this.rightChild = null;
        }

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }

        public TreeNode getLeftChild() {
            return leftChild;
        }

        public void setLeftChild(TreeNode leftChild) {
            this.leftChild = leftChild;
        }

        public TreeNode getRightChild() {
            return rightChild;
        }

        public void setRightChild(TreeNode rightChild) {
            this.rightChild = rightChild;
        }
    }

    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        System.out.print("binary height = "+binaryTree.getHeight());
        System.out.println("binary size = "+binaryTree.getSize());

        //binaryTree.preOrder(binaryTree.root);
        //binaryTree.nonPreOrder(binaryTree.root);
        /*System.out.println();
        binaryTree.midOrder(binaryTree.root);
        System.out.println();
        binaryTree.nonMidOrder(binaryTree.root);
        System.out.println();*/
        /*binaryTree.postOrder(binaryTree.root);
        System.out.println();
        binaryTree.nonPostOrder(binaryTree.root);
        System.out.println();*/

        binaryTree.cengxuOrder(binaryTree.root);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

释汐宇辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值