week11

101 - 对称二叉树

和100 相同的树类似,都是递归搜索左右子树;

这里对称的搜索方法是指 左节点的左子树和右节点的右子树一致,左节点的右子树和右节点的左子树一致;

class Solution {
public:
    vector<int> left, right;
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        return dfs(root->left, root->right);
    }
    bool dfs(TreeNode* left, TreeNode* right)
    {
        if(!left && !right) return true;
        if(!left || !right || left->val != right->val) return false;
        return dfs(left->left, right->right) && dfs(left->right, right->left);
    }
};

102 - 二叉树的层序遍历

BFS按层搜索就好

103 - 二叉树的锯齿形层次遍历

上一个题的基础上加上一个奇偶判断是否翻转即可

104 - 二叉树的最大深度

搜索题 BFS和DFS都可以解决

1. BFS

2. DFS

嗯 很基础

105 - 从前序和中序遍历序列构造二叉树

avatar

查找根节点位置 -> 哈希表 重点就在这几个区间的index怎么算上

首先,中序遍历中确定根节点的index为k, 那么两个子区间分别为[il, k - 1][k + 1, ir]

这样也确定了左子树子区间的长度为k - 1 - il + 1 = k - il, 右子树子区间的长度为ir - (k + 1) + 1 = ir - k

根据这个长度我们可以得到在前序遍历里面两个区间的位置,根节点为 pl

左子树子区间r - (pl + 1) + 1 = k - il -> r = k + pl - il

右子树子区间pr - l + 1 = ir - k -> l = k + pr - ir + 1

106 - 从中序和后序遍历序列构造二叉树

和上一题基本一致,无非是前序序列的根左右变成后序序列的左右根, 然后区间端点再重推一下

107 - 二叉树的层次遍历ii

正常层序遍历在反序就好了

108 - 将有序数组转换为二叉搜索树

中序遍历有序 等价于 是二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树;

考察的是线段树或者平衡树的初始化方式, 即如何从数组初始化为平衡树 -> 从中间对半分开

109 - 有序链表转换为二叉搜索树

和上面的题类似, 将链表从中点分开,然后分别递归构建左右子树即可; 这里找中点利用的是快慢指针,只用遍历一次子链表即可找到中点;

然后边界问题需要新建一个dummy指针指向头结点来实现,如果链表只剩下一个头结点要特判返回;

将一个链表分成两段 就是将指向mid的指针置为nullptr 就可以实现;

110 - 平衡二叉树

递归搜索深度加判断即可

Last updated