oracle pac

Upload: ramesh-foru

Post on 06-Apr-2018

386 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/3/2019 Oracle PAC

    1/30

    Question Number 1

    Given the following code snippet:

    void InsertNode(tNode** node, int i){

    if(*node == NULL){

    *node = new tNode;(*node)->pLeft = NULL;

    (*node)->data = i;

    (*node)->pRight = NULL;

    SetRootNode(node);

    return;

    }

    else{

    if(i < (*node)->data)

    InsertNode(&((*node)->pLeft), i);

    if(i > (*node)->data)

    InsertNode(&((*node)->pRight), i);

    return;

    }}

    void Func(tNode **node){

    if(*node!=NULL){

    Func(&(*node)->pLeft);

    tNode *temp;

    temp = (*node)->pLeft;

    (*node)->pLeft= (*node)->pRight;

    (*node)->pRight = temp;

    Func(&(*node)->pRight);

    }

    }

    void traverse(tNode** nd){

    if(*nd!=NULL){

    traverse(&((*nd)->pLeft));

    traverse(&((*nd)->pRight));

    std::cout

  • 8/3/2019 Oracle PAC

    2/30

    }

    bT->InsertNode(bT->GetRootNode(), 97);

    bT->Func(bT->GetRootNode());

    bT->InsertNode(bT->GetRootNode(), 99);

    bT->traverse(bT->GetRootNode());

    }

    98,15,78,96,97,99,10,12,5,100,120,110

    110,120,100,5,12,10,99,97,96,78,15,98

    100,110,120,98,5,10,12,15,78,96,97,99

    None of these

    -------------------------------------------------------------

    Question Number 2

    Given the following code snippet:

    void InsertNode(tNode** node, int i){

    if(*node == NULL){

    *node = new tNode;

    (*node)->pLeft = NULL;

    (*node)->data = i;(*node)->pRight = NULL;

    SetRootNode(node);

    return;

    }

    else{

    if(i < (*node)->data)

    InsertNode(&((*node)->pLeft), i);

    if(i > (*node)->data)

    InsertNode(&((*node)->pRight), i);

    return;

    }

    }

    void Func(tNode **node){

    if(*node!=NULL){

    Func(&(*node)->pLeft);

    tNode *temp;

    temp = (*node)->pLeft;

    (*node)->pLeft= (*node)->pRight;

    (*node)->pRight = temp;

    Func(&(*node)->pRight);

  • 8/3/2019 Oracle PAC

    3/30

    }

    }

    void traverse(tNode** nd){

    if(*nd!=NULL){

    traverse(&((*nd)->pLeft));

    traverse(&((*nd)->pRight));

    std::couttraverse(bT->GetRootNode());

    }

    120,110,100,99,98,96,78,15,12,10,5

    98,100,120,110,99,15,78,96,12,5,110

    110,5,12,96,78,15,99,110,120,100,98

    5,10,12,15,78,96,98,99,100,110,120

    ------------------------------------------------

    Question Number 3

    Given the following code snippet:

    void InsertNode(tNode** node, int i){

    if(*node == NULL){

    *node = new tNode;

    (*node)->pLeft = NULL;

    (*node)->data = i;

    (*node)->pRight = NULL;

  • 8/3/2019 Oracle PAC

    4/30

    SetRootNode(node);

    return;

    }

    else{

    if(i < (*node)->data)

    InsertNode(&((*node)->pLeft), i);

    if(i > (*node)->data)InsertNode(&((*node)->pRight), i);

    return;

    }

    }

    void Func(tNode **node){

    if(*node!=NULL){

    Func(&(*node)->pLeft);

    tNode *temp;

    temp = (*node)->pLeft;

    (*node)->pLeft= (*node)->pRight;

    (*node)->pRight = temp;

    Func(&(*node)->pRight);}

    }

    void traverse(tNode** nd){

    if(*nd!=NULL){

    traverse(&((*nd)->pLeft));

    traverse(&((*nd)->pRight));

    std::coutInsertNode(bT->GetRootNode(), 99);

    bT->Func(bT->GetRootNode());

    bT->traverse(bT->GetRootNode());

    }

  • 8/3/2019 Oracle PAC

    5/30

    5,12,10,99,96,78,15,110,120,100,98

    98,100,120,110,15,78,96,99,10,12,5

    5,10,12,15,78,96,98,99,100,110,120

    5,10,12,15,78,96,99,98,100,110,120

    ------------------------------------------

    Question Number 4

    Given the following code snippet:

    void InsertNode(tNode** node, int i){

    if(*node == NULL){

    *node = new tNode;

    (*node)->pLeft = NULL;

    (*node)->data = i;

    (*node)->pRight = NULL;

    SetRootNode(node);

    return;

    }

    else{

    if(i < (*node)->data)

    InsertNode(&((*node)->pLeft), i);

    if(i > (*node)->data)

    InsertNode(&((*node)->pRight), i);

    return;}

    }

    void Func(tNode **node){

    if(*node!=NULL){

    Func(&(*node)->pLeft);

    tNode *temp;

    temp = (*node)->pLeft;

    (*node)->pLeft= (*node)->pRight;

    (*node)->pRight = temp;

    Func(&(*node)->pRight);

    }

    }void traverse(tNode** nd){

    if(*nd!=NULL){

    traverse(&((*nd)->pLeft));

    traverse(&((*nd)->pRight));

    std::cout

  • 8/3/2019 Oracle PAC

    6/30

    Let the input given be

    98,15,100,10,78,120,5,12,96,110

    What would be the output of the following code snippet?

    int main(void)

    {tree *bT = new tree;

    int i = 10;

    int data;

    while(i--){

    std::coutGetRootNode(), data);

    }

    bT->Func(bT->GetRootNode());

    bT->InsertNode(bT->GetRootNode(), 99);

    bT->traverse(bT->GetRootNode());

    }

    98,15,78,96,99,10,12,5,100,120,110

    100,110,120,98,5,10,12,15,78,96,99

    110,120,100,5,12,10,99,96,78,15,98

    99,96,78,15,12,10,5,98,120,110,100

    ----------------------------------------------------------

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

  • 8/3/2019 Oracle PAC

    7/30

    / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

    Suppose InternalNode implements getLeft and getRight as part of its public interface to allow external code to navigate the

    tree. Their return type must be Node, because they may return either an internal or a terminal node. Which of the following

    is true:

    Node and TerminalNode must both provide concrete implementations of getLeft and getRight.

    It is sufficient to implement getLeft and getRight in TerminalNode.

    It is sufficient to implement getLeft and getRight in Node.

    None of these options

    --------------------------------------------------------------------------

    Question Number 6

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

    / / \"A" + "D"

    / \

    / \

    / \

    "B" "C"

    Consider this implementation of toString():

  • 8/3/2019 Oracle PAC

    8/30

    abstract class Node {

    abstract String toString();

    }

    class TerminalNode extends Node {

    String toString() {

    return value;}

    }

    class InternalNode extends Node {

    String toString() {

    if (null == left)

    return "[" + right + "]";

    else if (null == right)

    return "[" + left + "]";

    else

    return "[" + left + " | " + right + "]";

    }

    }

    Under what conditions will this implementation distinguish (i.e. produce different strings for) two trees that have the same

    strings in the same sequence in their terminal nodes but different internal structures?

    Never

    Only for full trees (ones in which every internal node has two children, except possibly the parent of the rightmost

    terminal node)

    Always-------------------------------------------------------

    Question Number 7

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

  • 8/3/2019 Oracle PAC

    9/30

    / / \

    / / \

    / / \

    "A" + "D"

    / \

    / \

    / \"B" "C"

    Should InternalNode have simple setters, as follows?

    void setLeft(Node nd) {

    left = nd;

    }

    void setRight(Node nd) {

    right = nd;

    }

    Node removeRight() {

    Node node = right;

    right = null;

    return node;

    }

    InternalNode removeRight() {

    InternalNode node = right;

    right = null;

    return node;}

    Node removeRight() {

    right = null;

    return right;

    }

    None of these options, since under some circumstances removing the right subtree of an InternalNode would violate the

    specifications.-------------------------------------------------------------------

    Question Number 8

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

  • 8/3/2019 Oracle PAC

    10/30

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \

    / \

    / \"B" "C"

    Suppose we want to be able to grow a tree by replacing the empty left or right subtree of an InternalNode (failing if that

    subtree is not empty). Since this operation will fail under certain common conditions well have the method return a boolean

    to indicate whether or not it succeeded, rather than throwing an exception. Which of the following best implement that idea

    in keeping with the specifications in the instructions?

    boolean addLeft(Node nd) {

    if (left == null) {

    left = nd;

    return true;

    }

    else

    return false;

    }

    and addRight similarly

    boolean addLeft(Node nd) {

    if (nd == null)

    return false;

    else {

    left = nd;

    return true;

    }

    }

    and addRight similarly

    boolean add(Node nd) {

    if (nd == null && right == null)

  • 8/3/2019 Oracle PAC

    11/30

    return false;

    else {

    left = nd;

    return true;

    }

    }

    and addRight similarly

    boolean add(Node nd) {

    if (nd == null)

    return false;

    else if (left == null) {

    left = nd;

    return true;

    }

    else if (right == null)

    right = nd;

    return true;}

    else

    return false;

    }

    ----------------------------------------------------------

    Question Number 9

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

  • 8/3/2019 Oracle PAC

    12/30

    Consider the following implementation of count as the number of nodes in a tree?

    abstract class Node {

    abstract int count();

    }

    class TerminalNode extends Node {int count() {

    return 1;

    }

    }

    class InternalNode extends Node {

    int count() {

    return 1 + left.count() + right.count();

    }

    }

    Which of the following statements is true?

    A run-time error could happen if left or right of an InternalNode were null.

    TerminalNode.count should return 0, not 1.

    InternalNode.count should not add 1 to the counts of its children.

    The code is correct as shown.----------------------------------------------

    Coding Skills (Advanced)

    Support ID: 110E229

    Question Number 10

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

  • 8/3/2019 Oracle PAC

    13/30

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \/ \

    / \

    "B" "C"

    Which of the following correctly defines count as the number of nodes in a tree if none of the other classes implement

    count?

    abstract class Node {

    int count() {

    return 1 + left.count() + right.count();

    }

    }

    abstract class Node {

    int count() {

    return 1 +

    ((left == null) ? 0 : left.count()) +

    ((right == null) ? 0 : right.count());

    }

    }

    A is correct, but B is not.

    B is correct, but not A.

    Neither is correct.

    Both are correct.

    -----------------------------------------

    Support ID: 110E236

    Skipped: Question Number 9

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

  • 8/3/2019 Oracle PAC

    14/30

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \/ \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

    Consider the following implementation of count as the number of nodes in a tree?

    abstract class Node {

    abstract int count();

    }

    class TerminalNode extends Node {

    int count() {

    return 1;

    }

    }

    class InternalNode extends Node {

    int count() {

    return 1 + left.count() + right.count();

    }

    }

    Which of the following statements is true?

    A run-time error could happen if left or right of an InternalNode were null.

    TerminalNode.count should return 0, not 1.

    InternalNode.count should not add 1 to the counts of its children.

    The code is correct as shown.

    =====================================

    Question Number 1

  • 8/3/2019 Oracle PAC

    15/30

    Given the following code snippet answer the following question.

    struct AVLTree

    {

    AVLTree * left;

    AVLTree * right;int element;

    int height;

    };

    int MAX(int a, int b){

    if(a>=b)

    return a;

    if(aheight;

    }

    }

    AVLTree * single_rotation_with_left(AVLTree *k2)

    {

    AVLTree *k1;

    k1 = k2->left;

    k2->left = k1->right;

    k1->right = k2;

    k2->height = MAX(height(k2->left), height(k2->right)) + 1;

    k1->height = MAX(height(k1->left), height(k2->right)) + 1;

    return k1;

    }

    AVLTree * single_rotation_with_right(AVLTree *k2)

    {

    AVLTree *k1;

    k1 = k2->right;

    k2->right = k1->left;

    k1->left = k2;

    k2->height = MAX(height(k2->left), height(k2->right)) + 1;k1->height = MAX(height(k1->right), height(k2->left)) + 1;

    return k1;

    }

    AVLTree *double_rotation_with_left(AVLTree *k3)

    {

    k3->left = single_rotation_with_right(k3->left);

    return single_rotation_with_left(k3);

    }

    AVLTree *double_rotation_with_right(AVLTree *k3)

  • 8/3/2019 Oracle PAC

    16/30

    {

    k3->right = single_rotation_with_left(k3->right);

    return single_rotation_with_right(k3);

    }

    void insert(int value, AVLTree **node)

    {

    if (*node == NULL){

    *node = new AVLTree;

    if (*node == NULL)

    {

    return;

    }

    (*node)->element = value;

    (*node)->height = 0;

    (*node)->left = (*node)->right = NULL;

    return;

    }

    else if (value < (*node)->element)

    {insert(value, &((*node)->left));

    if (height((*node)->left) - height((*node)->right) == 2)

    {

    if (value < (*node)->left->element)

    {

    *node = single_rotation_with_left(*node);

    }

    else

    {

    *node = double_rotation_with_left(*node);

    }

    }

    }

    else if (value > (*node)->element)

    {

    insert(value, &((*node)->right));

    if (height((*node)->right) - height((*node)->left) == 2)

    {

    if (value > (*node)->right->element)

    {

    *node = single_rotation_with_right(*node);

    }

    else

    {

    *node = double_rotation_with_right(*node);}

    }

    }

    (*node)->height = MAX(height((*node)->left), height((*node)->right)) + 1;

    }

    Consider an input sequence that is provided as an input to the insert method

    20,5,15,9,13,2,6,12,14,15,16,17,18,19

  • 8/3/2019 Oracle PAC

    17/30

    Let's give the root node of the resulting tree as input to the following code snippet

    int func(AVLTree **p)

    {

    if (*p!=0)

    return func (&(*p)->right) + 1;

    elsereturn 0;

    }

    What would be the return value after execution of the above code snippet?

    3

    4

    7

    6

    ---------------------------------------------------------

    Question Number 2

    Given the following code snippet answer the following question.

    struct AVLTree

    {

    AVLTree * left;

    AVLTree * right;

    int element;int height;

    };

    int MAX(int a, int b){

    if(a>=b)

    return a;

    if(aheight;

    }

    }

    AVLTree * single_rotation_with_left(AVLTree *k2)

    {

  • 8/3/2019 Oracle PAC

    18/30

    AVLTree *k1;

    k1 = k2->left;

    k2->left = k1->right;

    k1->right = k2;

    k2->height = MAX(height(k2->left), height(k2->right)) + 1;

    k1->height = MAX(height(k1->left), height(k2->right)) + 1;

    return k1;}

    AVLTree * single_rotation_with_right(AVLTree *k2)

    {

    AVLTree *k1;

    k1 = k2->right;

    k2->right = k1->left;

    k1->left = k2;

    k2->height = MAX(height(k2->left), height(k2->right)) + 1;

    k1->height = MAX(height(k1->right), height(k2->left)) + 1;

    return k1;

    }

    AVLTree *double_rotation_with_left(AVLTree *k3){

    k3->left = single_rotation_with_right(k3->left);

    return single_rotation_with_left(k3);

    }

    AVLTree *double_rotation_with_right(AVLTree *k3)

    {

    k3->right = single_rotation_with_left(k3->right);

    return single_rotation_with_right(k3);

    }

    void insert(int value, AVLTree **node)

    {

    if (*node == NULL)

    {

    *node = new AVLTree;

    if (*node == NULL)

    {

    return;

    }

    (*node)->element = value;

    (*node)->height = 0;

    (*node)->left = (*node)->right = NULL;

    return;

    }

    else if (value < (*node)->element)

    {insert(value, &((*node)->left));

    if (height((*node)->left) - height((*node)->right) == 2)

    {

    if (value < (*node)->left->element)

    {

    *node = single_rotation_with_left(*node);

    }

    else

    {

  • 8/3/2019 Oracle PAC

    19/30

    *node = double_rotation_with_left(*node);

    }

    }

    }

    else if (value > (*node)->element)

    {

    insert(value, &((*node)->right));if (height((*node)->right) - height((*node)->left) == 2)

    {

    if (value > (*node)->right->element)

    {

    *node = single_rotation_with_right(*node);

    }

    else

    {

    *node = double_rotation_with_right(*node);

    }

    }

    }

    (*node)->height = MAX(height((*node)->left), height((*node)->right)) + 1;

    }

    Consider an input sequence that is provided as an input to the insert method

    20,5,15,9,13,2,6,12,14,15,16,17,18,19

    Let's give the root node of the resulting tree as input to the following code snippet

    int func(AVLTree **p)

    {

    if (*p!=0)

    return func (&(*p)->right) + func (&(*p)->left) + 1;

    else

    return 0;

    }

    What would be the return value after execution of the above code snippet?

    13

    14

    15

    None of these

    -----------------------------------------

    Question Number 3

    Given the following code snippet answer the following question.

  • 8/3/2019 Oracle PAC

    20/30

    struct AVLTree

    {

    AVLTree * left;

    AVLTree * right;

    int element;

    int height;};

    int MAX(int a, int b){

    if(a>=b)

    return a;

    if(aheight;

    }

    }

    AVLTree * single_rotation_with_left(AVLTree *k2)

    {

    AVLTree *k1;

    k1 = k2->left;

    k2->left = k1->right;

    k1->right = k2;

    k2->height = MAX(height(k2->left), height(k2->right)) + 1;

    k1->height = MAX(height(k1->left), height(k2->right)) + 1;

    return k1;

    }

    AVLTree * single_rotation_with_right(AVLTree *k2)

    {

    AVLTree *k1;

    k1 = k2->right;

    k2->right = k1->left;

    k1->left = k2;

    k2->height = MAX(height(k2->left), height(k2->right)) + 1;

    k1->height = MAX(height(k1->right), height(k2->left)) + 1;

    return k1;}

    AVLTree *double_rotation_with_left(AVLTree *k3)

    {

    k3->left = single_rotation_with_right(k3->left);

    return single_rotation_with_left(k3);

    }

    AVLTree *double_rotation_with_right(AVLTree *k3)

    {

    k3->right = single_rotation_with_left(k3->right);

  • 8/3/2019 Oracle PAC

    21/30

    return single_rotation_with_right(k3);

    }

    void insert(int value, AVLTree **node)

    {

    if (*node == NULL)

    {

    *node = new AVLTree;if (*node == NULL)

    {

    return;

    }

    (*node)->element = value;

    (*node)->height = 0;

    (*node)->left = (*node)->right = NULL;

    return;

    }

    else if (value < (*node)->element)

    {

    insert(value, &((*node)->left));

    if (height((*node)->left) - height((*node)->right) == 2){

    if (value < (*node)->left->element)

    {

    *node = single_rotation_with_left(*node);

    }

    else

    {

    *node = double_rotation_with_left(*node);

    }

    }

    }

    else if (value > (*node)->element)

    {

    insert(value, &((*node)->right));

    if (height((*node)->right) - height((*node)->left) == 2)

    {

    if (value > (*node)->right->element)

    {

    *node = single_rotation_with_right(*node);

    }

    else

    {

    *node = double_rotation_with_right(*node);

    }

    }}

    (*node)->height = MAX(height((*node)->left), height((*node)->right)) + 1;

    }

    Consider an input sequence that is provided as an input to the insert method

    20,5,15,9,13,2,6,12,14,15,16,17,18,19

    In the process of inserting the above nodes how many times double_rotation_with_right is being called

  • 8/3/2019 Oracle PAC

    22/30

    3

    5

    2

    -----------------------------------

    Question Number 4

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \ / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

    The problem with the previous definition of InternalNode.sameShape is that it calls nd.getLeft() and nd.getRight(), but only

    InternalNode defines those methods and nd could be a TerminalNode. The following code fixes that and will compile, but it

    omits the tests for null

    abstract class Node {

    abstract boolean isTerminal();

    abstract boolean sameShape(Node);

    }

    class TerminalNode extends Node {

    boolean isTerminal() {

    return true;

    }

    boolean sameShape(Node nd) {

  • 8/3/2019 Oracle PAC

    23/30

    return nd.isTerminal();

    }

    }

    class InternalNode extends Node {

    boolean isTerminal() {

    return false;}

    boolean sameShape(Node nd) {

    return

    !nd.isTerminal() &&

    left.sameShape(((InternalNode)nd).getLeft()) &&

    right.sameShape(((InternalNode)nd).getRight());

    }

    }

    If sameShape is called on an InternalNode with a non-null argument, which of the two methods could end up getting called

    with a null argument for certain trees?

    Neither would ever get called with a null argument.

    TerminalNode.sameShape might be called with a null argument but not InternalNode.sameShape.

    InternalNode.sameShape might be called with a null argument but not TerminalNode.sameShape.

    Both methods could get called with a null argument.

    ---------------------------------------------------------Question Number 5

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

  • 8/3/2019 Oracle PAC

    24/30

    / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

    It is proposed to add a check for null at the beginning of each method, returning False if the argument is null, since a Node

    object would never have the same shape as null. This change is shown in the code below. Which methods will compile and

    work correctly now?

    abstract class Node {

    abstract boolean equals(Node);

    }

    class TerminalNode extends Node {

    boolean sameShape(Node nd) {

    return nd != null;

    }

    }

    class InternalNode extends Node {

    boolean sameShape(Node nd) {

    return

    nd != null &&

    left.sameShape(nd.getLeft()) &&

    right.sameShape(nd.getRight());

    }

    }

    Both TerminalNode.sameShape and InternalNode.sameShape are correct.

    TerminalNode.sameShape is fine the way it is but InternalNode.sameShape will not compile.

    TerminalNode.sameShape is fine the way it is but although TerminalNode.sameShape will compile, it is incorrect.

    Neither TerminalNode.sameShape nor InternalNode.equals provides a correct solution: each either does not compile or is

    not correct.

    -----------------------------------------------

    Question Number 6

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

  • 8/3/2019 Oracle PAC

    25/30

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \/ \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

    Here is a proposed implementation of sameShape for the tree structure:

    abstract class Node {

    abstract boolean sameShape(Node nd);

    }

    class TerminalNode extends Node {

    boolean sameShape(Node nd) {

    return true;

    }

    }

    class InternalNode extends Node {

    boolean sameShape(Node nd) {

    return left.sameShape(nd.getLeft()) &&

    right.sameShape(nd.getRight());

    }

    }

    Which classes contain correctly implemented methods?

    TerminalNode

    InternalNode

    A, but not B

    B, but not A

    Neither

  • 8/3/2019 Oracle PAC

    26/30

    Both

    ---------------------------

    Support ID: 110E22E

    Question Number 7

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +/ \

    / \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \

    / \

    / \

    "B" "C"

    One problem with the proposed implementation of sameShape is that two nodes of different types cannot have the same

    shape. In the following code which of TerminalNode.sameShape and InternalNode.sameShape correct this problem (though

    possibly leaving others uncorrected)?

    abstract class Node {

    abstract boolean isTerminal();

    abstract boolean sameShape(Node);

    }

    class TerminalNode extends Node {

    boolean isTerminal() {

    return true;}

    boolean sameShape(Node nd) {

    return nd != null && nd.isTerminal();

    }

    }

    class InternalNode extends Node {

    boolean isTerminal() {

    return false;

  • 8/3/2019 Oracle PAC

    27/30

    }

    boolean sameShape(Node nd) {

    return

    nd != null &&

    !nd.isTerminal() &&

    getLeft().sameShape(((InternalNode)nd).getLeft()) &&

    getRight().sameShape(((InternalNode)nd).getRight());}

    }

    Neither

    TerminalNode but not InternalNode

    InternalNode but not TerminalNode

    Both

    ---------------------------------------------

    Question Number 8

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left childB and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"/ \

    / \

    / \

    "B" "C"

    We want to define an operation to get the list element at position N (with the first element is at position 0). Which

    statements are correct in the following implementation? In answering, take into account all details of the statements

    labelled (A) and (B).

  • 8/3/2019 Oracle PAC

    28/30

    class SinglyLinkedList {

    InternalNode first;

    String nth(int n) {

    InternalNode nd = first;

    while (n-- > 0) nd = nd.getRight(); // (A)return ((TerminalNode)(nd.getLeft())).getValue(); // (B)

    }

    }

    A is completely correct, but B is not

    B is completely correct, but A is not

    Neither is completely correct.

    Both are completely correct.

    ==============================

    Question Number 9

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

    / / \"A" + "D"

    / \

    / \

    / \

    "B" "C"

  • 8/3/2019 Oracle PAC

    29/30

    In the implementation of many linear linked structures it is often useful to keep a pointer to the last node in addition to the

    first, so that a new node can be added at the end without having to loop through the entire structure looking for the last

    node. In what ways would adding a pointer to the last node improve the efficiency of this dictionary implementation?

    It would speed up put operations when the dictionary contains an item with the designated key.

    It would speed up put operations when the dictionary does not contain an item with the designated key.

    A but not B

    B but not A

    Both

    Neither

    ----------------------------------

    Question Number 10

    The subject of these questions is an unusually simple kind of binary tree, defined by these properties:

    Terminal nodes contain a string.

    Internal nodes have one or two children, called "left" and "right".

    Either child of an internal node may be null, but not both.

    Internal nodes contain no other information.

    By "tree" we simply mean a node and all of its descendants.

    A tree rooted at a node having left child A and right child B is a different tree than one rooted at a node having left child

    B and right child A.

    Here's an example, with plus signs (+) used to indicate internal nodes:

    +

    / \

    / \

    / \

    + +

    / / \

    / / \

    / / \

    "A" + "D"

    / \/ \

    / \

    "B" "C"

    Under what conditions would the following either produce an error or return an incorrect result? (Assume that given a top-

    level InternalNode (one whose left child is also an InternalNode) next and getValue are correctly defined.)

    public String get(String y) throws Exception {

  • 8/3/2019 Oracle PAC

    30/30

    InternalNode cur = first;

    while ((null != cur) && (!k.equals(getKey(cur))))

    cur = next(cur);

    return getValue(cur);

    when the dictionary is empty

    when the dictionary contains an entry whose key is equal to k

    when the dictionary does not contain an entry whose key is equal to k

    A and B but not C

    A only

    B and C but not A

    It is correct for all three conditions.

    -----------------------------------