文章目录
- 46 翻转二叉树
- 47 对称二叉树
- 48 二叉树的直径
- 49 二叉树的层序遍历
- 50 将有序数组转换为二叉搜索树
46 翻转二叉树
- 递归
- 前序遍历 / 后序遍历,这里给出前序遍历的代码。
- 遍历节点,交换左右子树。
var invertTree = function(root) {
if(root == null){
return root;
}
let tmp = new TreeNode();
tmp = root.left;
root.left = root.right;
root.right = tmp;
invertTree(root.left);
invertTree(root.right);
return root;
};
47 对称二叉树
- 递归
- 后序遍历
- 左子节点和右子节点分为以下几种情况:
(1) 左 = null,右 != null,不对称。
(2) 左 != null,右 = null,不对称。
(3) 左 = null,右 = null,对称。
(4) 左子节点的值 != 右子节点的值,不对称。
(5) 左子节点的值 = 右子节点的值,继续递归判断。 - 外侧节点的值相等和内侧节点的值相等,对称。
(1) 外侧:左子节点的左子节点,右子节点的右子节点(2 => 3)。
(2) 内测:左子节点的右子节点,右子节点的左子节点(2 => 4)。
var isSymmetric = function(root) {
var compare = function(left, right){
if(left == null && right != null){
return false;
}else if(left != null && right == null){
return false;
}else if(left == null && right == null){
return true;
}else if(left.val != right.val){
return false;
}
let leftnode = compare(left.left, right.right);
let rightnode = compare(left.right, right.left);
return leftnode && rightnode;
}
if(root == null){
return true;
}
return compare(root.left, root.right);
};
48 二叉树的直径
- 递归
- 遍历节点,更新以该节点为根节点的最大深度:max(该节点的左子树深度,该节点的右子树深度) + 1。
- 以当前节点为根节点,res = 该节点左右子树最大深度的和 + 1。
- 树的直径 = res - 1。
var diameterOfBinaryTree = function(root) {
var deep = function(root){
if(root == null){
return 0;
}
let left = deep(root.left);
let right = deep(root.right);
res = Math.max(res, left + right + 1);
return Math.max(left, right) + 1;
};
let res = 1;
deep(root);
return res - 1;
};
49 二叉树的层序遍历
- 队列
- 一层一层加入队列。
- size:控制每层的节点,当size = 0时,该层节点全部遍历完成。
var levelOrder = function(root) {
if(root == null){
return [];
}
let queue = [];
let res = [];
queue.push(root);
while(queue.length != 0){
let layer = [];
let size = queue.length;
while(size--){
let node = queue.shift();
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
layer.push(node.val);
}
res.push(layer);
}
return res;
};
50 将有序数组转换为二叉搜索树
- 递归
- 奇数个节点时,中间位置节点作为中心节点。
- 偶数个节点时,选取左 / 右作为中心节点。
- 中心节点划分左右区域,左区域为左子树,右区域为右子树。
var sortedArrayToBST = function(nums) {
var traversal = function(nums, left, right){
if(left > right){
return null;
}
let mid = Math.floor((left + right) / 2);
let node = new TreeNode(nums[mid]);
node.left = traversal(nums, left, mid - 1);
node.right = traversal(nums, mid + 1, right);
return node;
}
return traversal(nums, 0, nums.length - 1);
};