将一个二叉查找树按照中序遍历转换成双向链表。
样例:
给定一个二叉查找树:
4
/ \
2 5
/ \
1 3
返回 1<->2<->3<->4<->5。
#ifndef C378_H
#define C378_H
#include<iostream>
#include<vector>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int val)
{
this->val = val;
this->left = this->right = NULL;
}
};
class DoublyListNode{
public:
int val;
DoublyListNode *prev, *next;
DoublyListNode(int val)
{
this->val = val;
this->prev = this->next = NULL;
}
};
class Solution {
public:
/*
* @param root: The root of tree
* @return: the head of doubly list node
*/
DoublyListNode * bstToDoublyList(TreeNode * root) {
// write your code here
if (root == NULL)
return NULL;
inOrder(root);
int len = v.size();
vector<DoublyListNode*> douList;
for (auto c : v)
douList.push_back(new DoublyListNode(c->val));
if (len == 1)
{
douList[0]->next = NULL;
douList[0]->prev = NULL;
return douList[0];
}
for (int i = 0; i < len; ++i)
{
if (i == 0)
{
douList[i]->next = douList[i + 1];
douList[i]->prev = NULL;
}
else if (i == len - 1)
{
douList[i]->next = NULL;
douList[i]->prev = douList[i - 1];
}
else
{
douList[i]->next = douList[i + 1];
douList[i]->prev = douList[i - 1];
}
}
return douList[0];
}
void inOrder(TreeNode *root)
{
if (root == NULL)
return;
inOrder(root->left);
v.push_back(root);
inOrder(root->right);
}
vector<TreeNode*> v;
};
#endif