在二叉搜索树中查找第二个max元素

时间:2013-12-03 11:43:32

标签: c++ max binary-search-tree

我在二叉搜索树中找到第二个最大元素时遇到问题。 我不知道为什么,但在某些情况下我的程序崩溃或给出错误答案(我不知道那些情况)。 帮助我在下面的代码中找到我的算法中的问题。谢谢。

#include <iostream>
    using namespace std;
    struct Node {
        Node* right;
        Node* left;
        int data;
        Node* parent;
    };

    Node* maximum(Node *root){
        if (root -> right)
            return maximum(root -> right);
        else
            return root;
    }
    void insert(Node *root, Node *a){
        if (root -> left && root -> data > a -> data)
            return insert(root -> left, a);
        if (root -> right && root -> data < a -> data)
            return insert(root -> right, a);
        if (root -> data > a -> data){
            root -> left = a;
            a -> parent = root;
        }
        if (root -> data < a -> data){
            root -> right = a;
            a -> parent = root;
        }
    }
    int main(){
        int j = 0;
        int n = 0;
        Node *root = new Node;
        cin >> j;
        if (j != 0) {
            root -> data = j;
            root -> parent = NULL;
            root -> left = NULL;
            root -> right = NULL;
        } else {cout << "0"; return 0;}
        while (true){
            cin >> j;
            if (j == 0) break;
            Node *a = new Node;
            a -> data = j;
            a -> left = NULL;
            a -> right = NULL;
            a -> parent = NULL;
            insert(root, a);
        }
if(!max -> parent)
    if (max -> left)
        cout << maximum(max -> left) -> data;
    else
        cout << max -> data;
else
    if (max -> left && max -> left > max -> parent)
        cout << maximum(max -> left) -> data;
    else
        cout << max -> parent -> data;

        return 0;
    }

2 个答案:

答案 0 :(得分:0)

在以下代码中:

Node* max = maximum(root);

if (max->left){
    if (max->parent->data > max->left->data) cout << max->parent->data;
    else cout << max->left->data;
} else
    cout << max->parent->data;

如果您的max变成root,则max->parent将为NULL。因此,在NULL上进行测试之前,您应检查data条件。

答案 1 :(得分:0)

检查您是否遵循以下逻辑: -

第二个最大值将位于max或其父级的左子树中。

如果存在left-subtree,则找到最大的left-subtree,这是第二高

如果不存在左子树,那么max的父级是第二高的。

转角案件

1)root为null,即没有元素。无需检查所有这些。

2)Root是唯一的元素,即只有1个数字。所以没有第二高,因为root的父级是null。