1020 Tree Traversals (25 分) + 1138 Postorder Traversal (25 分) + 1127 ZigZagging on a Tree (30 分) ※
考察知识点:中序+前序/后序 =>层次
涉及到层次遍历最好做的方法是开一个vector,在DFS的时候,直接将对应深度的结点值放入即可。
1127唯一增加的难点在于每一层输出的顺序不一样,这个直接根据层次的奇偶输出即可。
1020通过代码
1021 Deepest Root (25 分) ※
考察知识点:图的连通问题,最长路径(树的直径)
首先图的连通问题可以用DFS/并查集解释都可以(因为这里不涉及多次建边连边的操作)。
其次,这道题本质上要求求解的就是树的直径问题。很明显这里面的边权都是1(为正),因此可以采用两遍DFS/树形DP的方式。我们第一遍DFS得到以某一个结点所有最长链的所有结点,从中随意选取一个结点作为根节点第二次DFS,最终的答案一定要是两个集合的并集!
1021通过代码
1086 Tree Traversals Again (25 分) ※
考察知识点:栈模拟中序遍历
需要深刻认识到当前被弹出的结点的意思:这是当前被弹出的结点,意味着该结点的左子树已经遍历完成,那么下一次的插入一定是在该结点的右子树。
1086通过代码
1102 Invert a Binary Tree (25 分)
考察知识点:树的反转
直接先访问右子树,再访问左子树即可。
1053 Path of Equal Weight (30 分)
1064 Complete Binary Search Tree (30 分) + 1099 Build A Binary Search Tree (30 分) + 1115 Counting Nodes in a BST (30 分) ※
考察知识点:完全二叉搜索树/给定结构的二叉搜索树
对于一棵二叉搜索树来说,子结点和父结点之间的键值是满足一定的关系的。对于每个结点,我们都要通过下标的关系:
i
∗
2
,
i
∗
2
+
1
i*2,i*2+1
i∗2,i∗2+1去判断存不存在这样的结点,然后统计每个结点左右子树中的结点数量,这样就能够确定根节点的值。
1064和1069的区别是一个确定了是完全二叉树,一个告诉了你树的结构,本质上都需要统计出每个根节点的子树中的结点个数。1115则是模拟插入的顺序构造一个二叉搜索树,并最后要求输出后两行的结点个数(vector保存就好)。
1064通过代码
1043 Is It a Binary Search Tree (25 分) ※※
考察知识点:二叉搜索树
给定的是一棵树的前序遍历,让我们判断这棵树是否是一个二叉搜索树/镜像的前序遍历。首先,前序遍历应该会满足第一个元素是根节点,然后,一定能在序列中找到一个边界,这个边界的左边都比根节点小,右边都比根节点大或相等。如果不满足这个特点,就可以得出这肯定不是一个二叉搜索树。
1043通过代码
1110 Complete Binary Tree (25 分)
考察知识点:完全二叉树的判定
使用一个队列判断,针对某个结点是否有左右孩子进行分类即可。
1110通过代码
1143 Lowest Common Ancestor (30 分) + 1151 LCA in a Binary Tree (30 分) ※※
求解LCA的方式这里用朴素LCA就可以,因此需要记录的是每个结点的深度,以及键值对应的TreeNode结点,可以使用map。
其中1143是给定一棵二叉搜索树的前序遍历,然后询问若干对结点的LCA。如果考虑建立这棵BST然后求解LCA,可以采取的方式:①第一个元素是根节点,然后找到元素的分界线,进而分别去构建左右子树;②利用BST的一个性质:BST的中序遍历就是所有元素键值从小到大的排列,这样我们就得到了中序遍历,就可以利用前序+中序建立BST树了,问题也就转换成了1151。
1143也可以采用更为简洁的方法:因为BST是一棵二叉树,因此只有唯一的根节点能够同时满足小于左子的键值,大于等于右子的键值,直接搜索即可。
1143通过代码
1135 Is It A Red-Black Tree (30 分) ※※
红黑树主要依靠DFS去统计红黑结点的数量,需要特别注意的是:红黑树并不是一棵层间红黑交替的树,仅仅要求红色结点的子结点是黑色的即可。
1135通过代码
1066 Root of AVL Tree (25 分) + 1123 Is It a Complete AVL Tree (30 分) ※※
AVL树的关键在于四种旋转操作:左单选,右单选,左右双旋,右左双旋。
1066通过代码
1119 Pre- and Post-order Traversals (30 分) ※※
给定前序+后序是没有办法确定一棵树的,主要原因就在于如果一棵树只有左子树或者右子树时,这在前序+后序中没有办法进行确定。这里要求我们判定根据前序+后序恢复的树是否唯一,也就是判定是否有结点只有左子树/右子树。我们只要在后序遍历的倒数第二个元素放到前序遍历中寻找,只要不是前序遍历的第二个元素(这样就肯定有一个子树时空)就唯一,如果不唯一假设为左子树/右子树都可以。
1119通过代码