第一题 把二元查找树转变成排序的双向链表

来源:互联网 发布:js toupcase 编辑:程序博客网 时间:2024/06/08 11:16
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    10
   /   \
  6   14
 /  \   /   \
4   8 12   16
转换成双向链表

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


注意二叉排序树的建立过程


#include<stdio.h>#include<stdlib.h>struct BiTreeNode{       int value;       BiTreeNode *left;       BiTreeNode *right; };typedef BiTreeNode* BSTree;typedef BiTreeNode BSTNode;void Convert(BiTreeNode *& head, BiTreeNode *& tail, BiTreeNode *root) {      BiTreeNode *left, *right;      if (root == NULL)       {            head = NULL;            tail = NULL;            return;      }      Convert(head, left, root->left);      Convert(right, tail, root->right);      if (left!=NULL)      {             left->right = root;             root->left = left;     }     else     {            head = root;    }    if (right!=NULL)    {         root->right=right;         right->left = root;   }    else     {          tail = root;    }}BiTreeNode * treeToLinkedList(BiTreeNode * root) { BiTreeNode * head, * tail; Convert(head, tail, root); return head;//返回链表的头指针}BiTreeNode *searchBST(BiTreeNode *root,int key){if((!root)||(root->value==key))return root;else if(key<root->value)return searchBST(root->right,key);else return searchBST(root->right,key);}BSTree InsertBST(BSTree Tptr,int key){BSTree f,p=Tptr;while(p){if(p->value==key) //不插入重复数字(关键字) return Tptr;f=p;   //f记录的是要插入的节点的父结点 p=(key<p->value)?p->Lchild:p->Rchild;}p=new BSTNode;p->key=key;p->Lchild=p->Rchild=NULL;if(Tptr==NULL)//如果本来是空树 Tptr=p;else  //原数中已有节点,则将p当作f的左孩子或者右孩子插入 {if(key<f->value)f->Lchild=p;elsef->Rchild=p; }return Tptr;  //将树的根节点还返回 } BSTree CreateBST()//建立二叉排序树 {BSTree T=NULL;int key;cout<<"输入元素:"<<endl;while(1){cin>>key;if(key==0) //默认不插入关键值是0的节点 break;T=InsertBST(T,key); //调用插入函数进行插入 }return T;}//中序遍历二叉树void InOrderTraverse(BiTreeNode * root){       if(root->left)   InOrderTraverse(root->left);   if(root)             printf("%d  ",root->value);   if(root->right)             InOrderTraverse(root->right);}int main(){        BiTreeNode * root=CreateBST();        InOrderTraverse(root);        printf("\n");       BiTreeNode *head=treeToLinkedList(root);       BiTreeNode * temp=head;        while(temp!=NULL)        {              printf("%d  ",temp->value);              temp=temp->right;        }       getchar();       return 0; }


0 0
原创粉丝点击