二叉树三种遍历方式,先序、中序、后序

原文链接:https://blog.csdn.net/u014291497/article/details/79433997

二叉树遍历方式分为三种:先序,中序和后序。 
可以以根节点的位置为参考来记遍历方式,在第一个为先序,中间为中序,最后为后序; 
即:先序: 根左右;中序:左根右;后序:左右根。

借个图: 
这里写图片描述

之前看过一个视频,关于如何遍历二叉树,只需要围绕二叉树画个轮廓结果就出来了,效果跟此文章类似:https://www.cnblogs.com/shunyu/p/4986288.html

每个节点左上角,底部,右上角分别对应先序,中序,后序时的取值点,以先序为例: 
(图画得略丑,见谅。。) 
这里写图片描述

在每个节点左上角做个标识,以根节点左上角为出发点,沿着树路径逆时针画个轮廓,以线先后经过的红点顺序记录节点值。 
即为A -> B -> C -> D -> E -> F -> G -> H -> K

对于中序遍历: 
这里写图片描述

以上述方法,即为 B -> D -> C -> A -> E -> H -> G -> K -> F

后序: 
这里写图片描述 
即为 D -> C -> B -> H -> K -> G -> F -> E -> A

当然,此方法对于新接触二叉树遍历很是快捷。熟练的话只要抓住遍历顺序规则很快就能得出结果。

JS获取遍历结果:

const data = {
    type: 'branch',
    value: 'A',
    left: {
        type: 'branch',
        value: 'B',
        left: null,
        right: {
            type: 'branch',
            value: 'C',
            left: {
                type: 'node',
                value: 'D',
                left: null,
                right: null
            },
            right: null
        }
    },
    right: {
        type: 'branch',
        value: 'E',
        left: null,
        right: {
            type: 'branch',
            value: 'F',
            left: {
                type: 'branch',
                value: 'G',
                left: {
                    type: 'node',
                    value: 'H',
                    left: null,
                    right: null
                },
                right: {
                    type: 'node',
                    value: 'K',
                    left: null,
                    right: null
                }
            },
            right: null
        }
    }
};

// 先序遍历
function preorder(data) {
    if (!data) {
        return [];
    }
    if (data.type === 'node') {
        return [data.value];
    } else {
        return [data.value, ...arguments.callee(data.left), ...arguments.callee(data.right)];
    }
}

// 中序遍历
function inorder(data) {
    if (!data) {
        return [];
    }
    if (data.type === 'node') {
        return [data.value];
    } else {
        return [...arguments.callee(data.left), data.value, ...arguments.callee(data.right)];
    }
}

// 后序遍历
function postorder(data) {
    if (!data) {
        return [];
    }
    if (data.type === 'node') {
        return [data.value];
    } else {
        return [...arguments.callee(data.left), ...arguments.callee(data.right), data.value,];
    }
}
console.log(preorder(data)); // ["A", "B", "C", "D", "E", "F", "G", "H", "K"]
console.log(inorder(data)); // ["B", "D", "C", "A", "E", "H", "G", "K", "F"]
console.log(postorder(data)); // ["D", "C", "B", "H", "K", "G", "F", "E", "A"]

猜你喜欢

转载自blog.csdn.net/Dxx_23/article/details/81100661