更新:
(B题)判断两棵树是否相同时,也可以用中序序列+另一序列是否相同判断,本题中中序序列一定相同,只用比较另一个序列是否相同
概念专题
(D题)
1. 判断是否为bst时,可以直接中序遍历得到中序序列,如果中序序列是否有序(中序序列有序的树一定是bst,无序一定不是,具有一一对应的判定关系)
//lastValue初始为-1
bool isbst(int idx, int lastValue) {
if(idx == -1) return true; // 空树是BST
return checkBST(node[idx].left, lastValue) // 判断左子树是否是BST
&& node[idx].K > lastValue // 当前结点的K值比中序遍历过程中上一个结点的K值大
&& checkBST(node[idx].right, node[idx].K); // 判断右子树是否是BST(对右子树来说lastValue是当前结点的K值)
2. 判断是否为堆,本质为后序遍历,子树都是堆并且根节点值最大时,树是堆。参考代码中用一个checkMaxHeap变量减小了一半的代码量
// 比较node[root].V是否大于或小于node[subNode].V
bool compareV(int root, int subNode, bool checkMaxHeap) {
if(subNode == -1) return true; // subNode为空时总是满足,以使其不影响checkHeap的结果
else if(checkMaxHeap) return node[root].V > node[subNode].V; // 检查大根堆时判断root的V是否大于subNode的V
else return node[root].V < node[subNode].V; // 检查小根堆时判断root的V是否小于subNode的V
}
// 检查是否是堆,本质是后序遍历,其中idx为当前字数的根节点编号,checkMaxHeap当检查大(小)根堆时为true(false)
bool checkHeap(int idx, bool checkMaxHeap) {
if(idx == -1) return true; // 空树是堆
return checkHeap(node[idx].left, checkMaxHeap) // 判断左子树是否是堆
&& checkHeap(node[idx].right, checkMaxHeap) // 判断右子树是否是堆
&& compareV(idx, node[idx].left, checkMaxHeap) // 当前结点的V值比左子树的最大(小)值大(小)
&& compareV(idx, node[idx].right, checkMaxHeap); // 当前结点的V值比由子树的最大(小)值大(小)
}
参考:
2019 浙大计算机考研机试模拟赛(1)——树专题 解题报告
2019 浙大计算机考研机试模拟赛(2) 概念专题解题报告