分解让复杂问题简单化-面试题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】4.4分解让复杂问题简单化——面试题27:二叉搜索树与双向链表
- 剑指offer:(27)分解让复杂问题简单化 :二叉搜索树与双链表
- 【剑指offer】4.4分解让复杂问题简单化——面试题26:复杂链表的复制
- 【剑指offer】4.4分解让复杂问题简单化——面试题28:字符串的排列
- 《剑指offer》刷题笔记(分解让复杂问题简单):二叉搜索树与双向链表
- (C++)剑指offer-26:二叉搜索树与双向链表(分解让复杂问题简单)
- 剑指Offer面试题26复杂链表的复制,面试题27二叉搜索树和双向链表(递归)
- 分解让复杂问题简单化-面试题28-字符串的排列与组合
- 分解让复杂问题简单化:二叉搜索树与双向链表
- 剑指Offer---面试题27:二叉搜索树与双向链表
- (剑指Offer)面试题27:二叉搜索树与双向链表
- 分解让复杂问题简单化:字符串的排列
- 面试题27:二叉搜索树转化为双向链表
- 分解让复杂问题简单化:复杂链表的复制
- 剑指offer面试题27-二叉搜索树转双向链表
- 剑指Offer系列-面试题27:二叉搜索树与双向链表
- 二叉搜索树转双向链表(面试题27)
- 剑指offer 面试题27 二叉搜索树与双向链表
- 面试题27:二叉搜索树转换为有序双向链表
- 剑指Offer----面试题27:二叉搜索树与双向链表