【刷题-考研上机模拟】树专题、概念专题解题更新

更新:

(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) 概念专题解题报告

原文地址:https://www.cnblogs.com/vinnson/p/10845008.html