提到二叉树,首先需要知道的就是前序遍历,中序遍历以及后序遍历,可以使用迭代/递归的方式进行计算,这里使用迭代。
前序遍历:力扣
只需要按照根节点-左孩子-右孩子的顺序即可
var preorderTraversal = function(root) {
var res = [];
if(root==null) return res;
var list = [root];
while(list.length) {
var cur = list.pop();
//先序遍历从父节点开始
res.push(cur.val);
// 先将右孩子加入栈,再加入左孩子
// 保证出栈是中左右的顺序
//递归右子树
cur.right && list.push(cur.right);
//递归左子树
cur.left && list.push(cur.left);
}
return res;
};
中序遍历:力扣
因为访问顺序和处理顺序不同:先访问二叉树顶部的节点,再逐层向下访问,到达树左面的最底部之后,再开始处理节点
var inorderTraversal = function(root) {
var res = [];
var list = [];
var cur = root;
while(list.length || cur) {
if(!cur) {
// 弹出cur
cur = list.pop();
// 中
res.push(cur.val);
// 右
cur = cur.right;
}
else {
// 访问二叉树顶部的节点
list.push(cur);
// 左
cur = cur.left;
}
}
return res;
};
后序遍历:力扣
将中左右变为中右左的遍历顺序,再反转res数组即可
var postorderTraversal = function(root) {
var res = [];
if(root==null) return res;
var list = [root];
while(list.length) {
var cur = list.pop();
//先序遍历从父节点开始
res.push(cur.val);
//递归左子树
cur.left && list.push(cur.left);
//递归右子树
cur.right && list.push(cur.right);
}
return res.reverse();
};
226.翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
链接:力扣
var invertTree = function(root) {
if(!root) return root;
var list = [root];
while(list.length) {
//先序遍历从父节点开始
var cur = list.pop();
if(cur) {
//递归右子树
cur.right && list.push(cur.right);
//递归左子树
cur.left && list.push(cur.left);
list.push(cur);
list.push(null);
}
else {
cur = list.pop();
changeNode(cur, cur.left, cur.right);
}
}
return root;
};
var changeNode = function(root, l, r) {
root.left = r;
root.right = l;
}
101.对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
链接:力扣
var isSymmetric = function(root) {
return booleanNode(root.left, root.right);
};
var booleanNode = function(l, r) {
// 如果只有根节点
if(!l && !r) return true;
// 如果根节点的左或右节点不存在,或根节点的左右节点不相同
if(!l || !r || l.val != r.val) return false;
return booleanNode(l.left, r.right) && booleanNode(l.right, r.left)
}