题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向.
第一种方法:
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指针域为空,最后要调整这两个结点的指针域才能构成完全
首尾相连的双向链表!!!