二叉树的遍历(构造、前、中、后序)
输入数据格式:(完全二叉树)
arr = [1,2,3,4,5,null,6]
主函数:
var tree = function(arr){
let root = construct(arr); // 构造二叉树
let ans = preorderTraversal(root); //前序遍历-迭代法
/**
let ans = [];
dfs(root,ans); //前序遍历-递归
**/
return ans;
}
构造(数组转树):
var construct = function(arr, index){
let val = arr[index-1];
if(val == null) return null;
return {
val,
left: construct(arr, index*2),
right: construct(arr, index*2+1)
} ;
}
前序(迭代)
var preorderTraversal = function(root) {
let stack = new Array() //模拟栈
let ans = new Array() //结果数组
let tmp;
if(root===null){
return ans
}
stack.push(root)
while(stack.length!==0){
tmp = stack.pop()
ans.push(tmp.val)
if(tmp.right!==null){
stack.push(tmp.right)
}
if(tmp.left!==null){
stack.push(tmp.left)
}
}
return ans
};
中序(迭代)
var inorderTraversal = function(root) {
let stack = new Array() //模拟栈
let ans = new Array() //结果数组
let tmp;
if(root===null){
return ans
}
tmp = root;
while(tmp!==null||stack.length!==0){
while(tmp!==null){
stack.push(tmp)
tmp = tmp.left;
}
tmp = stack.pop()
ans.push(tmp.val)
tmp = tmp.right
}
return ans
};
后序(迭代)
var postorderTraversal = function(root) {
let stack = new Array() //模拟栈
let ans = new Array() //结果数组
let tmp;
if(root===null){
return ans
}
tmp = root;
stack.push(tmp);
while(stack.length!==0){
tmp = stack.pop()
ans.unshift(tmp.val)
if(tmp.left!==null){
stack.push(tmp.left)
}
if(tmp.right!==null){
stack.push(tmp.right)
}
}
return ans
};
前序、中序、后序递归
// ans存储答案
//前序
var dfs = function(root,ans) {
if(root === null) return
ans.push(root.val)
dfs(root.left,ans)
dfs(root.right,ans)
}
//中序
var dfs = function(root,ans) {
if(root === null) return
dfs(root.left,ans)
ans.push(root.val)
dfs(root.right,ans)
}
//后序
var dfs = function(root,ans) {
if(root === null) return
dfs(root.left,ans)
dfs(root.right,ans)
ans.push(root.val)
}