您的位置:首页 > 职场人生

微软面试100之1 把二元查找树转变成排序的双向链表(树)

2013-09-02 14:08 411 查看
1.把二元查找树转变成排序的双向链表(树)

题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

10

/ /

6 14

/ / / /

4 8 12 16

转换成双向链表

4=6=8=10=12=14=16。

首先我们定义的二元查找树 节点的数据结构如下:

struct BSTreeNode

{

int m_nValue; // value of node

BSTreeNode *m_pLeft; // left child of node

BSTreeNode *m_pRight; // right child of node

};

#include <iostream>

#include <stdio.h>

using namespace std;

struct BSTreeNode {

int value;

BSTreeNode* left;

BSTreeNode* right;

};

typedef BSTreeNode* NODE ;

typedef BSTreeNode DoubleListNode;

DoubleListNode* dCur;

DoubleListNode* dhead;

void convertToDoubleListNode(BSTreeNode* pCur);

void addTreeNode(BSTreeNode* & pCur,int n) {

if(pCur==NULL) {

BSTreeNode * p = new BSTreeNode;

p->value = n;

p->left = NULL;

p->right = NULL;

pCur = p;

cout<<n<<endl;

}

else {

if(n>pCur->value) {

addTreeNode(pCur->left,n);

}

else {

addTreeNode(pCur->right,n);

}

}

}

void midSearch(BSTreeNode* root) {

if(root->left != NULL)

midSearch(root->left);

convertToDoubleListNode(root);

if(root->right != NULL)

midSearch(root->right);

}

void convertToDoubleListNode(BSTreeNode* pCur) {

if(dhead==NULL) {

dhead= pCur;

dCur = dhead;

}

else {

BSTreeNode p ;

BSTreeNode * q = NULL;

q = &p;

p.left = pCur->left;

p.value = pCur->value;

dCur->right= q;

q->left = dCur;

q->right = NULL;

dCur=q;

}

cout<<dCur->value<<endl;

}

int main() {

BSTreeNode * root = NULL;

dhead = NULL;

dCur = NULL;

addTreeNode(root,2);

addTreeNode(root,10);

addTreeNode(root,8);

addTreeNode(root,16);

addTreeNode(root,6);

addTreeNode(root,14);

addTreeNode(root,12);

midSearch(root);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐