跳到主要内容

二叉树

二叉树反转

function invertTree(root) {
// 如果当前节点为空,则直接返回
if (!root) {
return null;
}

// 交换当前节点的左右子节点
[root.left, root.right] = [root.right, root.left];

// 递归地反转左右子树
invertTree(root.left);
invertTree(root.right);

// 返回反转后的根节点
return root;
}

// 示例:创建一个简单的二叉树
// 4
// / \
// 2 7
// / \ / \
// 1 3 6 9
const root = {
val: 4,
left: {
val: 2,
left: { val: 1, left: null, right: null },
right: { val: 3, left: null, right: null }
},
right: {
val: 7,
left: { val: 6, left: null, right: null },
right: { val: 9, left: null, right: null }
}
};

// 反转二叉树
invertTree(root);

// 打印反转后的二叉树
function printTree(node) {
if (node === null) {
return;
}
console.log(node.val);
printTree(node.left);
printTree(node.right);
}

printTree(root); // 输出:4 7 9 6 2 3 1

类型以下二叉树层级蛇形输出

​ 2 4 5 7 9 11 13

输出结果为:2 4 5 13 11 9 7

class TreeNode {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}

function zigzagLevelOrder(root) {
if (!root) return [];

let result = [];
let queue = [root];
let leftToRight = true; // 用于控制遍历方向

while (queue.length > 0) {
let levelSize = queue.length;
let level = [];

for (let i = 0; i < levelSize; i++) {
let currentNode = queue.shift();

// 根据当前层的遍历方向决定添加到数组的位置
if (leftToRight) {
level.push(currentNode.value);
} else {
level.unshift(currentNode.value);
}

// 将子节点加入队列
item.left && queue.push(item.left);
item.right && queue.push(item.right);
}

// 反转遍历方向
leftToRight = !leftToRight;
result.push(...level);
}

// 将所有层级的结果合并成一个数组
return result.flat();
}

// 构建示例二叉树
let root = new TreeNode(2);
let root = new TreeNode(2);
root.left = new TreeNode(4);
root.right = new TreeNode(5);
root.left.left = new TreeNode(7);
root.left.right = new TreeNode(9);
root.right.left = new TreeNode(11);
root.right.right = new TreeNode(13);

// 执行蛇形层级遍历
console.log(zigzagLevelOrder(root)); // 输出: [2, 4, 5, 13, 11, 9, 7]

104. 二叉树的最大深度

示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:3

示例 2: 输入:root = [1,null,2] 输出:2

解法1

dfs 深度遍历 从左开始 递归终止调节 1、空 返回 1(当前深度) + dfs(left) 中的最大值dfs(right)

var maxDepth = function(root) {
if(root) return 0;
return 1 + Matn.max(maxDepth(root.left),maxDepth(root.right))

};

103. 二叉树的锯齿形层序遍历

示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]]

示例 2: 输入:root = [1] 输出:[[1]]

示例 3: 输入:root = [] 输出:[]

解法1

空 返回 1、res 记录值,queue存树 2、flag反转 3、1循环,queue有,新的list记录树的value, 4、2循环取queue中的值,list添加, queue看看有没有左右叶子 5、flag变化 res记录list

var zigzagLevelOrder = function(root) {
const res = [],queue = [root]
let flag = true;
if(!root) return res;
while(queue.length > 0) {
const size = queue.length;
const list = [];
const key = flag ? 'push': 'unshift'
for(let i = 0 ;i<size;i++){
const r = queue.shift();
list[key](r.val);
if(r.left) queue.push(r.left);
if(r.right) queue.push(r.right);
}
flag=!flag;
res.push(list)
}
return res;
};

二叉树前序遍历

function preorderTraversal(root) {
const result = [];
function traverse(node) {
if (!node) return;
result.push(node.value);
traverse(node.left);
traverse(node.right);
}
traverse(root);
return result;
}