您的位置:首页 > Web前端

剑指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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: