1,前序遍历
对于二叉树的前序遍历,只需要判断一下其左右子树是否存在,然后其余交给迭代方程即可
var preorderTraversal = function(root){
let res = []
if(!root) return res;
var order = function(node) {//前序递归方程
res.push(val);
if(node.left){
order(order.left)
}
if(node.right) {
order(order.right)
}
}
order(root)
return res
}
N叉树前序遍历唯一的不同点在于:N叉树是一整个children节点,不能直接添加进结果递归方程中,而是要把每个children的子节点取出来,然后进行递归
var preorder = function(root){
let inn = []
if(!root) return inn;
var order = function(node) {
inn.push(node.val);
if(node.children){
for(let i =0;i<node.children.length;i++) {
order(node.children[i])
}
}
}
order(root)
return inn
}
2,中序遍历
思路分析:前,中,后序遍历都是基于DFS,每个节点都有三个不同的驻留阶段,既每个节点都会被经过三次 1,在递归他的左子树之前 2,在递归完他的左子树之后,在递归右子树之前 3,在递归完右子树之后
const inorderTraversal = function(root) {
const inn = [];
const inorder = (root) => {
if (root == null) {
return;
}
inorder(root.left);
inn.push(root.val);
inorder(root.right);
};
inorder(root);
return inn;
};
3,后序遍历
递归:递归本身就是栈后进先出的原理,通过递归从最后一个结果开始保存到数组中,实现倒序push到插入数组
var reversePrint = function (head) {
let nums = []
const visitor = function (head) {
if (head !== null) {
visitor(head.next)
nums.push(head.val)
}
};
visitor(head)
return nums
}
最后说一下递归的三个要素
1,确认递归函数的参数和返回值:
确认那些参数是在递归过程中需要处理的,那么就在这些递归函数里加上这个参数,并且还要明确每次递归的返回值并确定递归函数的返回类型 2,确认终止条件: 写完递归算法运行的时候,经常会遇到栈溢出的错误,就是因为没写终止条件或者终止条件不对,操作系统也是有一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然会溢出 3,确认单层递归的逻级: 确认每层递归需要处理的信息,然后重复调用自己是实现递归的过程