提问者:小点点

如何打印bst中祖父母是5的倍数的节点?


很抱歉,这是我第一次在stackoverflow中提问。我刚刚阅读了常见问题解答,知道我违反了规则。我不仅仅是在应对和粘贴问题。我使用有序遍历方法进行递归,检查节点是否是5的倍数,我不知道接下来该做什么。我应该使用标志来检查什么吗?

void findNodes(BSTNode<Key,E> *root) const
{
    if(root==NULL) return;
    else
    {
        if(root->key()%5==0)//I know it's wrong, but I don't know what to do
        {
            findNodes(root->left());
            cout<<root->key()<<" ";
            findNodes(root->right());
        }
        else
        {
            findNodes(root->left());
            findNodes(root->right());
        }

    }
}

共3个答案

匿名用户

打印祖父母是5的倍数的节点很复杂,因为您必须“查找”树。如果您将问题视为找到5的倍数的所有节点并打印它们的子节点,则会更容易,因为您只需沿着树往下走。

void printGrandChildren(BSTNode<Key,E> *root,int level) const{
    if(!root) return;
    if(level == 2){
         cout<<root->key()<<" ";
         return;


    }else{
        printGrandChildren(root->left(),level+1);
        printGrandChildren(root->right(),level+1);

     }

}

然后修改您的findNodes为

void findNodes(BSTNode<Key,E> *root) const
{
    if(root==NULL) return;
    else
    {
        if(root->key()%5==0)
        {
            printGrandChildren(root,0);
        }
        else
        {
            findNodes(root->left());
            findNodes(root->right());
        }

    }
}

匿名用户

试试这个:

int arr[height_of_the_tree]; //arr[10000000] if needed;

void findNodes(BSTNode<Key,E> *root,int level) const {
  if(root==NULL) return;
  arr[level] = root -> key();
  findNodes(root -> left(), level + 1);
  if(2 <= level && arr[level - 2] % 5 == 0) cout << root->key() << " ";
  findNodes(root -> right(), level + 1);
}

int main() {
  ...
  findNodes(Binary_search_tree -> root,0);
  ...
}

匿名用户

替换以下内容

    cout<<root->key()<<" ";

随着

    if(root->left)
    {
        if(root->left->left)
            cout<<root->left->left->key()<< " ";
        if(root->left->right)
            cout<<root->left->right->key()<< " ";
    }
    if(root->right)
    {
        if(root->right->left)
            cout<<root->right->left->key()<< " ";
        if(root->right->right)
            cout<<root->right->right->key()<< " ";

    }