1. 程式人生 > >二叉樹三種遍歷方式,先序、中序、後序

二叉樹三種遍歷方式,先序、中序、後序

二叉樹遍歷方式分為三種:先序,中序和後序。
可以以根節點的位置為參考來記遍歷方式,在第一個為先序,中間為中序,最後為後序;
即:先序: 根左右;中序:左根右;後序:左右根。

借個圖:
這裡寫圖片描述

每個節點左上角,底部,右上角分別對應先序,中序,後序時的取值點,以先序為例:
(圖畫得略醜,見諒。。)
這裡寫圖片描述

在每個節點左上角做個標識,以根節點左上角為出發點,沿著樹路徑逆時針畫個輪廓,以線先後經過的紅點順序記錄節點值。
即為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"]