题目1503:二叉搜索树与双向链表
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:963
解决:259
-
题目描述:
-
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
-
输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。
-
输出:
-
对应每个测试案例,
输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。
-
样例输入:
-
1 2 1 0 0 3 0 0
-
样例输出:
-
1 2 3
-
#include <iostream> using namespace std; struct Node { int val; Node *left; Node *right; Node(int data):val(data),left(NULL),right(NULL){}//构造函数没有返回类型 }; Node * CreatTree(Node *pRoot) { int val; cin>>val; if(val!=0) { pRoot=new Node(val); pRoot->left=CreatTree(pRoot->left); pRoot->right=CreatTree(pRoot->right); } return pRoot; } void ConvertNode(Node *pNode,Node **pTemp)//左孩子*left指向前驱,右孩子*right指向后继。pTemp一直延续下去,注意用二级指正 { if(NULL==pNode) return; Node *pCur=pNode; if(pCur->left!=NULL) ConvertNode(pCur->left,pTemp);// pCur->left=*pTemp; if(*pTemp!=NULL) (*pTemp)->right=pCur; *pTemp=pCur; if(pCur->right!=NULL) ConvertNode(pCur->right,pTemp); } Node * Convert(Node *pNode) { Node *pLast=NULL; ConvertNode(pNode,&pLast); Node *pHead=pLast; while(pHead->left!=NULL&&pHead!=NULL) pHead=pHead->left; return pHead; } void PrintList(Node *pRoot) { if(pRoot==NULL) return; Node *pHead=pRoot; while(pHead!=NULL) { cout<<pHead->val<<" "; pHead=pHead->right; } } int main() { int n; while(cin>>n) { for(int i=0;i<n;i++) { Node *pRoot=NULL; Node *pTemp=NULL; Node *pHeadOfList; pRoot=CreatTree(pRoot); pHeadOfList=Convert(pRoot); PrintList(pHeadOfList); cout<<"\n"; } } return 0; } /************************************************************** Problem: 1503 User: road Language: C++ Result: Accepted Time:140 ms Memory:2312 kb ****************************************************************/