您的位置:首页 > Web前端

剑指offer---二叉搜索树与双向链表

2017-10-02 18:30 267 查看


题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解析:
递归。若左子树非空,左子树建立双链表,连接上根节点,若右子树非空,右子树建立双链表,连接到根节点后面。
代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
/* if(!pRootOfTree)
return NULL;
if(!pRootOfTree->left&&!pRootOfTree->right)
return pRootOfTree;
//将左子树构造成双链表,并返回链表头节点
TreeNode *left1=Convert(pRootOfTree->left);
TreeNode *p=left1;
//定位至左子树双链表最后一个节点
while(!p&&!p->right)
p=p->right;
//若左子树链表不为空,将当前pRootOfTree追加到左子树链表后面
if(!left1){
p->right=pRootOfTree;
pRootOfTree->left=p;
}
//将右子树构造成双链表,并返回头节点
TreeNode *right1=Convert(pRootOfTree->right);
//如果右子树链表不为空,将左子树链表追加到pRootOfTree节点之后
if(!right1){
right1->left=pRootOfTree;
pRootOfTree->right=right1;
}
return left1!=NULL?left1:pRootOfTree;*/
if(!pRootOfTree)
return NULL;
TreeNode *pointer=NULL;
convert2list(pRootOfTree,pointer);
while(pointer->left)
pointer=pointer->left;
return pointer;
}
void convert2list(TreeNode *pRoot,TreeNode *&pointer){
if(!pRoot)
return;
if(pRoot->left)
convert2list(pRoot->left,pointer);
pRoot->left=pointer;
if(pointer)
pointer->right=pRoot;
pointer=pRoot;
if(pRoot->right)
convert2list(pRoot->right,pointer);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: