您的位置:首页 > 职场人生

分解让复杂问题简单化-面试题27-二叉搜索树与双向链表

2016-10-12 21:16 337 查看


题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。




解法:

如下图所示,找到左子树的最右结点,该结点和根结点形成双向链表,接着找到右子树的最左结点,根结点与该结点形成双向链表,递归




Code:

/*
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==NULL)
return NULL;
if(pRootOfTree->left==NULL && pRootOfTree->right==NULL)
return pRootOfTree;
TreeNode* pLeftRoot=Convert(pRootOfTree->left); //left List
TreeNode* pLeftNode=pLeftRoot;
while(pLeftNode!=NULL && pLeftNode->right!=NULL){
pLeftNode=pLeftNode->right;
} //定位到左子树的最右边的结点
if(pLeftRoot){
pLeftNode->right=pRootOfTree;
pRootOfTree->left=pLeftNode;
} //如果左子树链表不为空的话,将当前root和左子树的最右边的结点形成双向关系
TreeNode* pRightRoot=Convert(pRootOfTree->right); //right List
TreeNode* pRightNode=pRightRoot;
while(pRightNode!=NULL && pRightNode->left!=NULL){
pRightNode=pRightNode->left;
} //定位到右子树的最左边的结点
if(pRightRoot){
pRootOfTree->right=pRightNode;
pRightNode->left=pRootOfTree;
} //如果右子树链表不为空的话,将当前root和右子树的最左边的结点形成双向关系
if(pLeftRoot)
return pLeftRoot;
else
return pRootOfTree;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer 链表