【PAT Advanced】树、图

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 i2,i2+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通过代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值