ツリー回転ダブルチェーンテーブル(マイクロソフト面接100題001)
ツリーを入力し、ツリーを並べ替えた双方向チェーンテーブルに変換します.新しいノードを作成できず、ポインタの方向のみを調整する必要があります.例:
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;