手记

二叉树遍历算法


先序遍历

思路:先根节点->左子树->右子树;

二叉树如下图:

二叉树遍历算法

/**

 * TreeSearch 简要描述

 * <p> TODO:描述该类职责 </p>

 *

 * @author ckmike

 * @version 1.0

 * @date 18-12-6 下午10:13

 * @copyright ckmike

 **/

public class TreeSearch {

    // 节点数据结构

    class TreeNode{

        private String value = null;

        private TreeNode leftchildren = null;

        private TreeNode rightchildre = null;

        public TreeNode(String value, TreeNode leftchildren, TreeNode rightchildre) {

            this.value = value;

            this.leftchildren = leftchildren;

            this.rightchildre = rightchildre;

        }

        public TreeNode(String value) {

            this.value = value;

        }

        public void setValue(String value) {

            this.value = value;

        }

        public void setLeftchildren(TreeNode leftchildren) {

            this.leftchildren = leftchildren;

        }

        public void setRightchildre(TreeNode rightchildre) {

            this.rightchildre = rightchildre;

        }

        public String getValue() {

            return value;

        }

        public TreeNode getLeftchildren() {

            return leftchildren;

        }

        public TreeNode getRightchildre() {

            return rightchildre;

        }

    }

    public TreeNode getTargetTree() {

        // 叶子节点

        TreeNode G = new TreeNode("G");

        TreeNode D = new TreeNode("D");

        TreeNode E = new TreeNode("E",G,null);

        TreeNode B = new TreeNode("B",D,E);

        TreeNode H = new TreeNode("H");

        TreeNode I = new TreeNode("I");

        TreeNode F = new TreeNode("F",H,I);

        TreeNode C = new TreeNode("C",null,F);

        // 构造根节点

        TreeNode root = new TreeNode("A",B,C);

        return root;

    }

    // 先序遍历二叉树

    public void preorderVistTreeNode(TreeNode node){

        if(null != node){

            System.out.print(node.value);

            if(null != node.leftchildren){

                preorderVistTreeNode(node.leftchildren);

            }

            if(null != node.rightchildre){

                preorderVistTreeNode(node.rightchildre);

            }

        }

    }

    public static void main(String[] args) {

       TreeSearch treeSearch = new TreeSearch();

       TreeNode tree= treeSearch.getTargetTree();

       treeSearch.preorderVistTreeNode(tree);

    }

}

二叉树遍历算法

先序遍历结果:ABDEGCFHI

中序遍历

思路:先左子树->根节点->右子树;

    // 中序遍历

    public void inorderVistTreeNode(TreeNode node){

        if(null != node){

            if(null != node.leftchildren){

                inorderVistTreeNode(node.leftchildren);

            }

            System.out.print(node.value);

            if(null != node.rightchildre){

                inorderVistTreeNode(node.rightchildre);

            }

        }

    }

    public static void main(String[] args) {

       TreeSearch treeSearch = new TreeSearch();

       TreeNode tree= treeSearch.getTargetTree();

        System.out.print("中序遍历:");

       treeSearch.inorderVistTreeNode(tree);

    }

二叉树遍历算法

中序遍历结果:DBGEACHFI

后序遍历

思路:先左子树->右子树->根节点;

    // 后序遍历

    public void postorderVistTreeNode(TreeNode node){

        if(null != node){

            if(null != node.leftchildren){

                postorderVistTreeNode(node.leftchildren);

            }

            if(null != node.rightchildre){

                postorderVistTreeNode(node.rightchildre);

            }

            System.out.print(node.value);

        }

    }

    public static void main(String[] args) {

       TreeSearch treeSearch = new TreeSearch();

       TreeNode tree= treeSearch.getTargetTree();

        System.out.print("后序遍历:");

       treeSearch.postorderVistTreeNode(tree);

    }

二叉树遍历算法

后序遍历结果:DGEBHIFCA

层序遍历

思路:先根节点,然后第二层,第三层,依次往下走,(同层节点从左往右输出);

// 层序遍历

    public void levelorderVistTreeNode(TreeNode node){

        if(null != node){

            LinkedList<TreeNode> list = new LinkedList<TreeNode>();

            list.add(node);

            TreeNode currentNode;

            while (!list.isEmpty()){

                currentNode = list.poll();

                System.out.print(currentNode.value);

                if(null != currentNode.leftchildren){

                    list.add(currentNode.leftchildren);

                }

                if(null != currentNode.rightchildre){

                    list.add(currentNode.rightchildre);

                }

            }

        }

    }

    public static void main(String[] args) {

       TreeSearch treeSearch = new TreeSearch();

       TreeNode tree= treeSearch.getTargetTree();

        System.out.print("层序遍历:");

       treeSearch.levelorderVistTreeNode(tree);

    }

二叉树遍历算法

层序遍历:ABCDEFGHI

这里要注意一点就是层序遍历二叉树,是非递归的队列实现的,就是利用队列的先进先出(FIFO)实现的。那么写到这里就把先序遍历、中序遍历、后序遍历、层序遍历二叉树的算法都写完了,是不是很简单。如果有兴趣可以想想有没有不用递归实现先、中、后序遍历的算法,用你熟悉的语言编写出来,写出来了记得分享出来哟。

©著作权归作者所有:来自51CTO博客作者刺激乐天派的原创作品,如需转载,请注明出处,否则将追究法律责任


0人推荐
随时随地看视频
慕课网APP