二叉樹三種遍歷方式,先序、中序、後序
阿新 • • 發佈:2019-02-14
二叉樹遍歷方式分為三種:先序,中序和後序。
可以以根節點的位置為參考來記遍歷方式,在第一個為先序,中間為中序,最後為後序;
即:先序: 根左右;中序:左根右;後序:左右根。
借個圖:
每個節點左上角,底部,右上角分別對應先序,中序,後序時的取值點,以先序為例:
(圖畫得略醜,見諒。。)
在每個節點左上角做個標識,以根節點左上角為出發點,沿著樹路徑逆時針畫個輪廓,以線先後經過的紅點順序記錄節點值。
即為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"]