您的位置:首页 > 其它

二叉搜索树与双向链表

2016-06-14 12:18 369 查看

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。算法设计:二叉搜索树中序遍历结果保存在队列中,再从队列中逐个修改指针。代码:
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
queue<TreeNode*>q;
queue<TreeNode*> ConvertQueue(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL)
return q;
inorder(pRootOfTree);
return q;
}

TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL)
return NULL;
inorder(pRootOfTree);
TreeNode *head = q.front();
TreeNode *p = head;
q.pop();
TreeNode *pnext ;

while(!q.empty()){
pnext = q.front();
p->right = pnext;
pnext->left = p;
p = pnext;
q.pop();
}
return head;
}
void inorder(TreeNode* root){
if(root->left!=NULL)
inorder(root->left);
q.push(root);
if(root->right!=NULL)
inorder(root->right);
}
};
int main() {
TreeNode *root= new TreeNode(4);
TreeNode *r1l = new TreeNode(2);
TreeNode *r1r = new TreeNode(5);
TreeNode *r2l = new TreeNode(1);
TreeNode *r2r = new TreeNode(3);
root->left = r1l;
root->right = r1r;
r1l->left = r2l;
r1l->right = r2r;
queue<TreeNode* > q;
Solution s;
q = s.Convert(root);
while(!q.empty()){
TreeNode* x = q.front();
cout<<x->val<<' ';
q.pop();
}

cout<< endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: