递归实现:
// 前序遍历
function pre(root,result){
if(!root){
return 0;
}
if(root){
result.push(root.val);
}
pre(root.left,result);
pre(root.right,result);
return result;
}
// 中序遍历
function mid(root,result){
if(root){
mid(root.left,result);
result.push(root.val);
mid(root.right,result);
}
return result;
}
// 后序遍历 last
function last(root,result){
if(root){
mid(root.left,result);
mid(root.right,result);
result.push(root.val);
}
return result
}
迭代实现:
// 非递归实现前序遍历
function pre2(root,stack){
let result = [];
if(root){
stack.push(root);
}
while(stack.length!==0){
let cur = stack.pop();
result.push(cur.val);
let right = cur.right;
let left = cur.left;
if(right){
stack.push(right);
}
if(left){
stack.push(left);
}
}
return result;
}
// 非递归实现中序遍历
function mid2(root){
let result = [];
let stack = [];
while(true){
// 首先找出所有含有左子树(含最后一个左结点)的结点入栈
while(root){
stack.push(root);
root = root.left;
}
// 栈空即遍历完,写在这里是因为一开始是空的 要先压栈
if(stack.length == 0){
break;
}
// 第一个while跳出,即找到了没有左子树的结点
// 将这个结点弹出 输出
let cur = stack.pop();
result.push(cur.val);
// 然后开始遍历右子树
root = cur.right;
}
return result
}
后序遍历就用前序的方式实现 最后调用result.reserve即可