题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
首先,二叉搜索树的特点是根>左孩子,根<右孩子。因此,root.left=左子树最右节点,root.right=右子树最左节点。
/*
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* Left=Convert(pRootOfTree->left);//左子树头结点
TreeNode* p=Left;
while(Left!=NULL&&Left->right!=NULL) //最右节点
{
Left=Left->right;
}
if(Left!=NULL) //根与左子树最右节点连接
{
Left->right=pRootOfTree;
pRootOfTree->left=Left;
}
TreeNode* Right=Convert(pRootOfTree->right);//右子树头结点
if(Right!=NULL) //根与右子树最左节点连接(头结点)
{
pRootOfTree->right=Right;
Right->left=pRootOfTree;
}
return p!=NULL?p:pRootOfTree;//左子树为空,头结点为根节点
}
};
本文介绍如何将一棵二叉搜索树转换为排序的双向链表,通过递归方式处理左子树和右子树,实现节点间的连接而无需创建新节点。此过程利用了二叉搜索树的特性。
577

被折叠的 条评论
为什么被折叠?



