第一题 把二元查找树转变成排序的双向链表
来源:互联网 发布:js toupcase 编辑:程序博客网 时间:2024/06/08 11:16
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 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
- 微软面试100题 第一题 把二元查找树转变成排序的双向链表
- 微软100题-第一题把二元查找树转变成排序的双向链表
- 第一题:把二元查找树转变成排序的双向链表
- 第一题 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- .把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- c#的DateTime.Now函数详解
- HA集群中的虚拟IP原理
- Codeforces 101B Buses 排序+树状数组
- golang指针与C指针的异同
- 模糊查询
- 第一题 把二元查找树转变成排序的双向链表
- iPhone5s通过M7协处理器获取运动数据
- android 定位
- 进程与线程及其区别
- Future和FutureTask的使用
- BoomBeach一名种菜党的独白与呐喊(转自bommbeach吧)
- POJ 1966 Cable TV Network(无向图的顶点连通度)
- HTML5基础资源分享
- LeedCode:Linked List Cycle II