二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)
如题目所述,本题是中序的线索化。
1、如果没有前驱或后继指针,也就是中序遍历中没有前一个节点或后一个节点,则前驱指针和后继指针为空指针。
2、如果有前驱、后继指针,根据中序遍历,前驱指针指向中序遍历的前一个节点,后继指针指向中序遍历的后一个节点。
InorderConvert:我们用参数 prev 来表示节点的前驱节点,prev初始化为 nullptr 。
由中序遍历的递归写法,先找到链表的头节点 4 ,根据二叉树的中序遍历,4 并没有前驱节点,所以此时 prev 仍为空指针,我们让 cur 的前驱指针指向prev,接着递归,返回上一层。
递归后 cur 为6,prev为 4,此时我们找到了 4 的后继节点,于是我们让 prev 的后继指针指向cur,cur 的前驱指针指向 prev,这样就把4的前驱和后继都处理好了, 接着让 prev = cur ,便于下一步递归,这里就显现了参数传引用的好处。
递归结束后,链表也建立好了,我们用 while 循环来找链表的头节点,头节点是函数 Convert 的返回值,while 里面的两个条件是为了避免空指针的解引用。
class Solution {
public:
void InorderConvert(TreeNode* cur,TreeNode*& prev)
{
if(cur==nullptr)
return;
//中序遍历
InorderConvert(cur->left,prev);
cur->left=prev;//前驱
if(prev)
prev->right=cur;//后继
prev=cur;//prev迭代
InorderConvert(cur->right,prev);
}
TreeNode* Convert(TreeNode* pRootOfTree) {
TreeNode* prev=nullptr;
InorderConvert(pRootOfTree,prev);
//找二叉树转换为链表后的头
TreeNode*head=pRootOfTree;
while(head&&head->left)
{
head=head->left;
}
return head;
}
};