您的位置:首页 > 其它

牛客网-二叉搜索树转换成一个排序的双向链表

2016-10-19 18:22 288 查看
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向.

第一种方法:

class Solution {
public:
void buildseq(TreeNode* pRootOfTree)
{
if (pRootOfTree != NULL){   //各元素依次入栈
buildseq(pRootOfTree->left);
node.push_back(pRootOfTree);
buildseq(pRootOfTree->right);
}
}

TreeNode* Convert(TreeNode* pRootOfTree)
{
int i;
buildseq(pRootOfTree);
if (node.size() == 0)head=NULL;   //修改前后邻居
else{
head = node[0];
for (i = 0; i < node.size()-1; i++){
node[i]->right = node[i + 1];
node[i + 1]->left = node[i];
}
}
return head;
}
vector<TreeNode *>node;
TreeNode * head=NULL;
};
这种方法思想比较简单,先中序遍历二叉树,将每个结点保存在容器里,然后对容器里面的元素进行首尾相连;

第二种方法:

class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
if (pRootOfTree == 0)   return 0;   //空树①
TreeNode *head = 0;
if (pRootOfTree->left == 0 && pRootOfTree->right == 0)return pRootOfTree;
TreeNode* lhead = 0;
TreeNode* rhead = 0;
if (pRootOfTree->left != 0) {
lhead = Convert(pRootOfTree->left); //返回左子树的头结点④
head = lhead;
while (lhead->right)lhead = lhead->right;
lhead->right = pRootOfTree;    //左子树进行链接,直接向右搜索
pRootOfTree->left = lhead;
}
else head = pRootOfTree;      //⑤
if (pRootOfTree->right != 0) {   //能到这里说明只有根的左子树为空,则根结点肯是这这颗树的lead
rhead = Convert(pRootOfTree->right);
pRootOfTree->right = rhead;
rhead->left = pRootOfTree;
}
return head;  //将子树的最左结点一直返回
}            //直到根结点
};


这种方法在原地进行操作,无需容器,通过这种方法建立的双向链表的头结点的left指针域为空,尾节点的right指针域为空,最后要调整这两个结点的指针域才能构成完全

首尾相连的双向链表!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐