剑指offer——二叉搜索树与双向链表
2018-03-05 10:48
204 查看
题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:这个题本质上其实是对二叉搜索树的中序遍历,但是要对结点的指针稍作改动。
1.先遍历左子树,将其构造成双链表,并返回链表的‘根’结点;
2.得到左子树双链表的最后一个结点;
3.如果左子树不为空,将当前根结点追加到左子树链表后;
4.遍历右子树,将其构造成双链表,并返回链表的‘根’结点;
5.如果右子树不为空,将右子树链表追加到当前根结点之后;
6.返回结点。
参考代码:/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* ConvertNode( TreeNode* root)
{
if( root == nullptr)
return nullptr;
if( root->left != nullptr)
{
TreeNode* left = ConvertNode(root->left);
while( left->right != nullptr)
left = left->right;
root->left = left;
left->right = root;
}
if( root->right != nullptr)
{
TreeNode* right = ConvertNode(root->right);
while( right->left != nullptr)
right = right->left;
right->left = root;
root->right = right;
}
return root;
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if( pRootOfTree == nullptr)
return nullptr;
TreeNode* pRoot = ConvertNode(pRootOfTree);
while( pRoot->left != nullptr)
pRoot = pRoot->left;
return pRoot;
}
};
分析:这个题本质上其实是对二叉搜索树的中序遍历,但是要对结点的指针稍作改动。
1.先遍历左子树,将其构造成双链表,并返回链表的‘根’结点;
2.得到左子树双链表的最后一个结点;
3.如果左子树不为空,将当前根结点追加到左子树链表后;
4.遍历右子树,将其构造成双链表,并返回链表的‘根’结点;
5.如果右子树不为空,将右子树链表追加到当前根结点之后;
6.返回结点。
参考代码:/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* ConvertNode( TreeNode* root)
{
if( root == nullptr)
return nullptr;
if( root->left != nullptr)
{
TreeNode* left = ConvertNode(root->left);
while( left->right != nullptr)
left = left->right;
root->left = left;
left->right = root;
}
if( root->right != nullptr)
{
TreeNode* right = ConvertNode(root->right);
while( right->left != nullptr)
right = right->left;
right->left = root;
root->right = right;
}
return root;
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if( pRootOfTree == nullptr)
return nullptr;
TreeNode* pRoot = ConvertNode(pRootOfTree);
while( pRoot->left != nullptr)
pRoot = pRoot->left;
return pRoot;
}
};
相关文章推荐
- 剑指offer——面试题27:二叉搜索树与双向链表
- 【剑指offer】二叉搜索树转双向链表
- 剑指offer:二叉搜索树与双向链表
- 剑指offer-二叉搜索树与双向链表
- 【剑指offer】二叉搜索树与双向链表
- 剑指offer - 二叉搜索树转双向链表
- 剑指Offer之二叉搜索树与双向链表
- 剑指offer(27)——二叉搜索树与双向链表
- [剑指Offer] 26.二叉搜索树与双向链表
- 剑指Offer:二叉搜索树与双向链表
- 剑指Offer 27 二叉搜索树与双向链表
- 【面试题】剑指Offer-27-将二叉搜索树转换成排序的双向链表
- 剑指offer 二叉搜索树与双向链表
- 【剑指Offer面试编程题】题目1503:二叉搜索树与双向链表--九度OJ
- 剑指Offer27:二叉搜索树与双向链表
- 剑指offer 4.4 分解简化问题2-二叉搜索树转双向链表
- 剑指offer 面试题27 二叉搜索树与双向链表
- 剑指Offer—26—二叉搜索树与双向链表
- 剑指Offer-面试题27:二叉搜索树与双向链表
- 剑指Offer——二叉搜索树转换为双向链表