题解 | 二叉搜索树与双向链表
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* head = nullptr;
TreeNode* pre = nullptr;//为什么不能两个在一行声明?
TreeNode* Convert(TreeNode* pRootOfTree) {
//按照提议不能使用栈
//使用双指针
if(pRootOfTree==nullptr) return nullptr;
Convert(pRootOfTree->left);
if(head==nullptr){
head = pRootOfTree;
pre = pRootOfTree;
}
else{
pRootOfTree->left = pre;
pre->right = pRootOfTree;
pre = pRootOfTree;
}
Convert(pRootOfTree->right);
return head;
}
};
二叉搜索树就是中序遍历。
像这种树的前序、中序、后序遍历,用递归法遍历,唯一区别就是处理代码放在哪里的问题。
它们都会有往左和往右两个递归函数在函数体内部,先左右后,两个内部的递归函数把函数体分为三个部分。
前序遍历就把处理代码放第一个部分,中序遍历就放第二个部分,后序遍历就放第三个部分。
注意所有的递归函数都有退出条件,有时会和错误检查放在一起(比如检查是否为空),一般放置在最前面。
对这道题来说中间的处理就是添加指针,需要找到当前节点的前一个节点,因为我们的代码本身就是按照顺序来的,所以直接记录上一个节点就好了。
又因为需要找到双向链表唯一头节点返回,所以添加了一个if(head==nullptr)的检查,也起到初始化pre的作用。
注意不用的指针都先给置为空指针比较好,避免产生悬空指针问题。
查看9道真题和解析