二叉树
前序or先序二叉树遍历
根据图示字母表示节点,数字表示遍历输出的顺序
function beforeTraversal(root){
let result = []
let stack = []
while(root || stack.length>0){
while(root){
result.push(root.val)
stack.push(root)
root = root.left
}
root = stack.pop()
root = root.right
}
return result
}
分析代码运行时入栈出栈的顺序是:
- A,B,D,E 入(result)栈,入(stack)栈,
- E出(stack)栈
- D出(stack)栈
- F入(result)栈,入(stack)栈,
- F出(stack)栈
- A出(stack)栈
- C入(result)栈,入(stack)栈
- H入(result)栈,入(stack)栈
- G入(result)栈,入(stack)栈
- G出(stack)栈
- H出(stack)栈
- C出(stack)栈
- S入(result)栈,入(stack)栈
- S出(stack)栈 入(result)栈即是最后输出的顺序 : A B D E F C H G S
二叉树的中序遍历
根据图示字母表示节点,数字表示遍历输出的顺序
function inorderTraversal(root){
if(!root)return [];
let result = []
let stack = []
while(root || stack.length ){
while(root){
stack.push(root)
root = root.left
}
root = stack.pop()
result.push(root.val)
root = root.right
}
return res
}
分析代码运行时入栈出栈的顺序是:
- A 入(stack)栈
- B 入(stack)栈
- D 入(stack)栈
- E 入(stack)栈
- E 出(stack)栈,E 入(result)栈
- D 出(stack)栈,D 入(result)栈
- F 入(stack)栈,F 出(stack)栈,F 入(result)栈
- B 出(stack)栈,B 入(result)栈
- A 出(stack)栈,A 入(result)栈
- C 入(stack)栈
- H 入(stack)栈,H 出(stack)栈, H 入(result)栈
- G 入(stack)栈,G 出(stack)栈, G 入(result)栈
- C 出(stack)栈,C 入(result)栈
- S 入(stack)栈,S 出(stack), S 入(result)栈 最后输出结果是:E D F B A H G C S
二叉树的后序遍历
根据图示字母表示节点,数字表示遍历输出的顺序
function postorderTraversal(root) {
let result =[];
let stack = [];
while (root || stack.length){
while(root){
stack.push(root);
result.unshift(root.val); //这里unshift 入栈入的是最前面
root = root.right;
}
root = stack.pop();
root = root.left;
}
return res;
};
分析代码运行时入栈出栈的顺序是:
- A 入(stack)栈, A入(result)栈
- C 入(stack)栈, C入(result)栈 此时 result : [C,A]
- S 入(stack)栈, S入(result)栈 result: [S,C,A]
- S 出(stack)栈
- C 出(stack)栈
- H 入(stack)栈,H入(result)栈 result:[H,S,C,A]
- G 入(stack)栈, G入(result)栈 result:[G,H,S,C,A]
- G 出(stack)栈
- H 出(stack)栈
- A 出(stack)栈
- B 入(stack)栈, B入(result)栈 result:[B,G,H,S,C,A]
- B 出(stack)栈
- D 入(stack)栈, D入(result)栈 result:[D,B,G,H,S,C,A]
- F 入(stack)栈, F入(result)栈 result:[F,D,B,G,H,S,C,A]
- F 出(stack)栈
- D 出(stack)栈
- E 入(stack)栈, E入(result)栈 result:[E,F,D,B,G,H,A,C,A]
- E 出(stack)栈 最后输出结果是:[E,F,D,B,G,H,A,C,A] 后序遍历从入栈出栈顺序可以看出来是从树的右边开始遍历并利用了js 数组的方法unshift进行越后入栈的元素排在最前 从而实现了后序遍历