题目:二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
将二叉搜索树拉直,左边为小右边为大,然后连接左边和根、右边和根。注意返回最小的节点才能通过测试用例。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* C(TreeNode* root){
if(root==NULL) return NULL;
TreeNode *l,*r;
l = C(root->left);
r = C(root->right);
if(l){
while(l->right) l = l->right;
l->right = root;
root->left = l;
}
if(r){
while(r->left) r = r->left;
r->left = root;
root->right = r;
}
return root;
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL) return NULL;
pRootOfTree = C(pRootOfTree);
while(pRootOfTree->left) pRootOfTree = pRootOfTree->left;
return pRootOfTree;
}
};
第一次测试代码死活不通过,我连测试用例都写了,然后说
用例:
{10,6,14,4,8,12,16}
对应输出应该为:
From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
你的输出为:
From left to right are:10,12,14,16;From right to left are:16,14,12,10,8,6,4;
原因是返回的是最小的节点。
#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==NULL) return NULL;
TreeNode *l,*r;
l = Convert(pRootOfTree->left);
r = Convert(pRootOfTree->right);
if(l){
while(l->right) l = l->right;
l->right = pRootOfTree;
pRootOfTree->left = l;
}
if(r){
while(r->left) r = r->left;
r->left = pRootOfTree;
pRootOfTree->right = r;
}
return pRootOfTree;
}
TreeNode * Build(vector<int> &v){
int size = v.size();
if(size==0) return NULL;
TreeNode *res = new TreeNode(v[0]);
queue<TreeNode *> q;
q.push(res);
int i=1;
while(q.size()>0 && i<size){
int size2 = q.size();
while(size2 && i<size){
TreeNode *now = q.front();
now->left = new TreeNode(v[i++]);
now->right = new TreeNode(v[i++]);
q.push(now->left);
q.push(now->right);
q.pop();
}
}
return res;
}
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> res;
if(root == NULL) return res;
queue<TreeNode *> q;
q.push(root);
while(q.size()>0){
int size = q.size();
while(size){
TreeNode *now = q.front();
res.push_back(now->val);
if(now->left)
q.push(now->left);
if(now->right)
q.push(now->right);
q.pop();
size--;
}
}
return res;
}
int main(){
vector<int> v = {10,6,14,4,8,12,16};
TreeNode *r = Build(v);
vector<int> vv = PrintFromTopToBottom(r);
for(int i=0;i<vv.size();i++)
cout<<vv[i]<<" ";
cout<<endl;
r = Convert(r);
while(r->right) r = r->right;
while(r){
cout<<r->val<<" ";
r = r->left;
}
cout<<endl;
return 0;
}