二元查找树转换成一个排序的双向链表

来源:互联网 发布:阿松为什么被禁 知乎 编辑:程序博客网 时间:2024/06/05 16:38

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。


最直观的一种思路就是每次从二分查找树中找到最小的数,加到链表中


</pre><pre name="code" class="cpp">// BST2list.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h" #include<iostream> using namespace std;#define INFINITY 1000000struct BiNOde{int ele;BiNOde* lnode;BiNOde* rnode;};int min;BiNOde*head, *tail;BiNOde*minnode;BiNOde*p;BiNOde*create_tree(){BiNOde * root = new BiNOde;BiNOde*node1 = new BiNOde;BiNOde*node2 = new BiNOde;BiNOde*node3 = new BiNOde;BiNOde*node4 = new BiNOde;BiNOde*node5 = new BiNOde;BiNOde*node6 = new BiNOde;BiNOde*node7 = new BiNOde;BiNOde*node8 = new BiNOde;BiNOde*node9 = new BiNOde;BiNOde*node10 = new BiNOde;BiNOde*node11 = new BiNOde;root->ele = 45;node1->ele = 38;node2->ele = 55;node3->ele = 33;node4->ele = 43;node5->ele = 19;node6->ele = 16;node7->ele = 52;node8->ele = 58;node9->ele = 50;node10->ele = 41;node11->ele = 35;root->lnode = node1;root->rnode = node2;node1->lnode = node3;node1->rnode = node4;node2->lnode = node7;node2->rnode = node8;node3->lnode = node5;node3->rnode = node11;node4->lnode = node10;node4->rnode = NULL;node5->lnode = node6;node5->rnode = NULL;node6->lnode = NULL;node6->rnode = NULL;node7->lnode = node9;node7->rnode = NULL;node8->lnode = NULL;node8->rnode = NULL;node9->lnode = NULL;node9->rnode = NULL;node10->lnode = NULL;node10->rnode = NULL;node11->lnode = NULL;node11->rnode = NULL;//BiNOde*node12 = new BiNOde;  //node12->ele = 12;  //node12->lnode = NULL;  //node12->rnode = NULL;  //node6->lnode = node11;  return root;}BiNOde*find_min(BiNOde*node){//minnode=node;这一句会使递归出错if (node == NULL)return NULL;if (node->ele < min){min = node->ele;minnode = node;}if (node->lnode != NULL){if (node->lnode->ele < min){min = node->lnode->ele;minnode = node->lnode;}find_min(node->lnode);}if (node->rnode != NULL){if (node->rnode->ele < min){min = node->rnode->ele;minnode = node->rnode;}find_min(node->rnode);}return minnode;}void findparent(BiNOde*node, BiNOde*parent){if (parent == NULL)return;if (parent->lnode == node || parent->rnode == node){p = parent;return;}findparent(node, parent->lnode);findparent(node, parent->rnode);}BiNOde*BST2list(BiNOde*root){min = INFINITY;minnode = NULL;BiNOde*n = find_min(root);while (n){if (n == root){if (n->rnode != NULL)root = n->rnode;else{tail->rnode = n;n->lnode = tail;tail = n;return head;}}elseif (n->rnode != NULL){p = NULL;findparent(n, root);if (p != NULL)p->lnode = n->rnode;n->rnode = NULL;}else{p = NULL;findparent(n, root);if (p != NULL)p->lnode = NULL;}if (head == NULL&&tail == NULL){head = tail = n;}else if (head == tail){tail->rnode = n;n->lnode = tail;tail = n;head->rnode = tail;}else{tail->rnode = n;n->lnode = tail;tail = n;}min = INFINITY;minnode = NULL;n = find_min(root);}}int _tmain(int argc, _TCHAR* argv[]){head = tail = NULL;BiNOde*root = create_tree();head = BST2list(root);system("pause");return 0;}

find_min递归时minnode数据放的位置不对,造成开始递归失败。所以要特别注意以影响递归过程的变量的处理。


0 0