链式存储的二叉树定义
function TreeNode(val,left,right){
this.val = (val===undefined?0:val);
this.left = (left===undefined?null:left);
this.right = (right===undefined?null:right);
}
var root = [1, null, 2, 3];
// var preorderTraversal = function(root) {
// var res = [];
// var stack = [];
// var cur = root;
// while(cur || stack.length){
// while(cur){
// res.push(cur.val);
// stack.push(cur);
// cur = cur.left;
// }
// cur = stack.pop();
// cur = cur.right;
// }
// return res;
// };
var preorderTraversal = function (root) {
let res = [];
const dfs = function (root) {
if (root === null) return;
//先序遍历所以从父节点开始
res.push(root.val);
//递归左子树
dfs(root.left);
//递归右子树
dfs(root.right);
}
//只使用一个参数 使用闭包进行存储结果
dfs(root);
return res;
};
console.log(preorderTraversal(root));
// 前序遍历:
// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {
if(!root) return res;
const stack = [root];
let cur = null;
while(stack.length) {
cur = stack.pop();
res.push(cur.val);
cur.right && stack.push(cur.right);
cur.left && stack.push(cur.left);
}
return res;
};
var root=[1,null,2,3]
var postorderTraversal = function(root) {
let res = []
const postorder = (root) => {
if (root === null) return
postorder(root.left)
postorder(root.right)
res.push(root.val)
}
postorder(root)
return res
}
//代码随想录:
//二叉树的递归遍历
var postorderTraversal = function(root) {
let res=[];
const dfs=function(root){
if(root===null){
return ;
}
dfs(root.left);
dfs(root.right);
res.push(root.val);
}
dfs(root);
return res;
};
//二叉树的迭代遍历
// 后序遍历:
// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转
var postorderTraversal = function(root, res = []) {
if (!root) return res;
const stack = [root];
let cur = null;
do {
cur = stack.pop();
res.push(cur.val);
cur.left && stack.push(cur.left);
cur.right && stack.push(cur.right);
} while(stack.length);
return res.reverse();
};
var root =[1,null,2,3];
var inorderTraversal = function(root) {
var res = [];
var inorder = function(root){
if(root==null) return;
inorder(root.left);
res.push(root.val);
inorder(root.right);
}
inorder(root);
return res;
};
// 方法二:迭代
var inorderTraversal = function(root) {
let res=[];
const dfs=function(root){
if(root===null){
return ;
}
dfs(root.left);
res.push(root.val);
dfs(root.right);
}
dfs(root);
return res;
};
// 中序遍历:
// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右
var inorderTraversal = function(root, res = []) {
const stack = [];
let cur = root;
while(stack.length || cur) {
if(cur) {
stack.push(cur);
// 左
cur = cur.left;
} else {
// --> 弹出 中
cur = stack.pop();
res.push(cur.val);
// 右
cur = cur.right;
}
};
return res;
};