ツリー回転ダブルチェーンテーブル(マイクロソフト面接100題001)

5151 ワード

タイトル:
ツリーを入力し、ツリーを並べ替えた双方向チェーンテーブルに変換します.新しいノードを作成できず、ポインタの方向のみを調整する必要があります.例:
10//6 14////4 8 12 16は、双方向チェーンテーブルに変換される:4=6=8=10=12=14=16.
solution1
最初の解決策は答えの中で提供されたもので、純粋なc言語解法ではなく、c++の参照伝達パラメータを使用し、結果も双方向チェーンテーブルではなく、一方向チェーンテーブルであり、コードは以下の通りである.
 
 

include

include

//
typedef struct BSTreeNode{
int m_nValue; //value of node
struct BSTreeNode *m_pleft;
struct BSTreeNode *m_pright;
} BSTreeNode;

typedef BSTreeNode DoubleList;

DoubleList *pHead;
DoubleList *pListIndex;

void convertToDoubleList(BSTreeNode *pCurrent);

// value
void addBSTreeNode(BSTreeNode* &pCurrent, int value)
{
if (NULL==pCurrent)
{
//c++ new
//BSTreeNode *pBSTree=new BSTreeNode();
BSTreeNode *pBSTree=(BSTreeNode *)malloc(sizeof(BSTreeNode));
pBSTree->m_nValue=value;
pBSTree->m_pleft=NULL;
pBSTree->m_pright=NULL;
pCurrent = pBSTree;

}
else
{
    //     
    if((pCurrent->m_nValue)>value)
    {
        addBSTreeNode(pCurrent->m_pleft,value);
    }
    else if((pCurrent->m_nValue)m_pright,value);
    }
    else
    {
        printf("     
"); }

}// ルックアップツリーvoid ergodicBSTree(BSTreeNode*pCurrent){if(NULL=pCurrent){return;}
//    ,        
if(NULL != pCurrent->m_pleft){
    ergodicBSTree(pCurrent->m_pleft);
}

//        
convertToDoubleList(pCurrent);

//    ,         
if(NULL != pCurrent->m_pright){
    ergodicBSTree(pCurrent->m_pright);
}

}
void convertToDoubleList(BSTreeNode *pCurrent){ pCurrent->m_pleft=pListIndex;
if(NULL !=pListIndex)
{
    pListIndex->m_pright =pCurrent;
}
else
{
    pHead=pCurrent;
}
printf("the value is %d
",pCurrent->m_nValue);

} int main(){ BSTreeNode *pRoot=NULL; pListIndex=NULL; pHead=NULL; addBSTreeNode(pRoot,10); addBSTreeNode(pRoot,4); addBSTreeNode(pRoot,6); addBSTreeNode(pRoot,8); addBSTreeNode(pRoot,12); addBSTreeNode(pRoot,14); addBSTreeNode(pRoot,15); ergodicBSTree(pRoot); printf("the end"); return 0; }
まとめ:このコードはg++を してコンパイルする があります
solution2
なcのコード、2 のsolutionは が に に って、 は1つのとてもはっきりした の を して、 の はルートノードに るだけで、チェーンテーブルの のノードに ります:
  • サブツリーがnullでない 、 サブツリー1を する.a) に サブツリーを チェーンテーブルに する.1.b)ルートノードの ノード( サブツリーの のノード)を し す.c) つけたノードとルートノードを
  • に する.
  • サブツリーがnullでない 、 サブツリー( と )1を する.a) に サブツリーを チェーンテーブルに する.1.b)ルートノードの ノード( サブツリーの のノード)を し す.c) つけたノードとルートノードを
  • に する.
  • のノードを つけて
  • に ります.
    ソースコードは のとおりです:
     
     

    include "stdio.h"

    include "stdlib.h"

    typedef struct Node{
    int data;
    struct Node *left;
    struct Node *right;

    }Node;

    // ,
    Node * create(){
    Node *root;
    Node *p4=(Node *)malloc(sizeof(Node));
    Node *p8=(Node *)malloc(sizeof(Node));
    Node *p6=(Node *)malloc(sizeof(Node));
    Node *p12=(Node *)malloc(sizeof(Node));
    Node *p16=(Node *)malloc(sizeof(Node));
    Node *p14=(Node *)malloc(sizeof(Node));
    Node *p10=(Node *)malloc(sizeof(Node));
    Node *p1=(Node *)malloc(sizeof(Node));
    Node *p5=(Node *)malloc(sizeof(Node));
    Node *p18=(Node )malloc(sizeof(Node));
    p4->data=4;
    p8->data=8;
    p6->data=6;
    p12->data=12;
    p16->data=16;
    p14->data=14;
    p10->data=10;
    p1->data=1;
    p5->data=5;
    p18->data=18;
    p4->left=p1;
    p4->right=p5;
    p16->right=p18;
    p6->left=p4;
    p6->right=p8;
    p10->left=p6;
    p10->right=p14;
    p14->left=p12;
    p14->right=p16;
    root=p10;
    return p10;
    }
    // ,
    Node
    change(Node root){
    //base case
    if(!root)
    return NULL;
    // ,
    if(root->left!=NULL){
    //
    Node
    left=change(root->left);
    for (;left->right!=NULL;left=left->right);
    left->right=root;
    root->left=left;
    }

    //     ,         
    if(root->right!=NULL){
        Node* right=change(root->right);
        for(;right->left!=NULL;right=right->left);
        right->left=root;
        root->right=right;
    }
    return root;
    
    }
    Node * treeto2list(Node *root){ if (root==NULL){ return root; } root = change(root); while (root->left!=NULL) root = root->left; return root; }
    int main(){ Node *root=create(); Node *head = treeto2list(root); Node *tail=NULL; while(head){ printf("the number is %d",head->data); tail=head; head=head->right; } printf(「 」);while(tail){ printf("the number is %d",tail->data); tail=tail->left; } return 0; }
    まとめ: は えにくいので、このいくつかの を してください.
    //          ,           ,   root         
    for (;left->right!=NULL;left=left->right);
    left->right=root;
    root->left=left;