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

微软,Google面试题 (1) —— 把二叉排序树转变成排序的双向链表

2010-03-04 22:01 507 查看
#include <cstdio>
#include <cstdlib>
using namespace std;
struct treeNode {
int id;
struct treeNode *lchild;
struct treeNode *rchild;
};
void insert(struct treeNode*& node, int x) {
if (node == NULL) {
node = (struct treeNode*)malloc(sizeof(struct treeNode));
node->id = x;
node->lchild = NULL;
node->rchild = NULL;
return;
}
else if (x < node->id)
insert(node->lchild, x);
else if (x > node->id)
insert(node->rchild, x);
else
return;
}
void visit(struct treeNode* node, struct treeNode*& prev) {
if (node == NULL)
return;
if (node->lchild != NULL)
visit(node->lchild, prev);

if (prev == NULL)
node->lchild = prev;
else {
node->lchild = prev;
prev->rchild = node;
}
prev = node;

if (node->rchild != NULL)
visit(node->rchild, prev);
}

struct treeNode* changeToList(struct treeNode* node) {
struct treeNode* prev = NULL;
struct treeNode* head = node;
visit(node, prev);
while (head != NULL && head->lchild != NULL)
head = head->lchild;
return head;
}
int main() {
struct treeNode *root = (struct treeNode*)malloc(sizeof(struct treeNode));
root->id = 10;
root->lchild = root->rchild = NULL;
insert(root, 6);
insert(root, 14);
insert(root, 4);
insert(root, 8);
insert(root, 12);
insert(root, 16);
struct treeNode *head = changeToList(root);
return 0;
}


采用的是中序遍历的方法,因为中序遍历二叉排序树是有序的,所以每访问一个节点,就把该节点置为prev,之后每访问一个节点,就和prev(也就是链表的尾节点)相连接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: