分类: C/C++
2010-04-11 20:07:23
8--10--15--20--24--30--32。
先定义一个二叉搜索树的结构和其上的插入操作,在其中加入上述节点,struct node { //二叉搜索树节点定义struct node * BST2DLL(struct node * root,int is_right_flag){
int data;
struct node* left;
struct node* right;
};
void tree_insert(struct node * root, struct node * new_node){ //插入节点的方法
struct node * curr1 = root;
struct node * curr2 = curr1;
while(curr1 != NULL){ //curr1沿路径下降,而curr2始终指向curr1的父节点。
curr2 = curr1;
if(new_node->data <= curr->data)
curr1 = curr1->left;
else
curr1 = curr1->right;
}
if(curr2 == NULL){ //这说明root本来就是NULL
root = new_node;
}else{
if(new_node->data < curr2->data)
curr2->left = new_node;
else
curr2->right = new_node;
}
}
int main(){
struct node * BSTree;
int array[7] = {15,20,10,8,30,24,32};
for(int i=0; i<7; i++){
struct node *new_node = (struct node *)malloc(sizeof(struct node));
new_node->data = array[i];
new_node->left = new_node->right = NULL;
tree_insert(BSTree, new_node);
struct node * DLL = BST2DLL(BSTree,1);
//BST2DLL执行后,效果还不完全是双向链表, 8=10=15=20=24=30=32,但是8和32之间还没连接。
//可通过一次遍历构造8和32直接的连接。
struct node * tmp = DLL;
while(tmp->right != NULL)
tmp++;
DLL->left = tmp;
tmp->right = DLL;
//此时DLL指向的才是一个真正的双向链表
}
//引入is_right_flag的作用:is_right_flag为1,返回的是指向链表最左端的元素的指针;
// is_right_flag为0,返回的是指向链表最右端的元素的指针;
//这是为了红色部分执行合并时的正确性