题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
二叉搜索树和双向链表(大佬的思路,萌新望尘莫及)
把原来大佬的指针引用传递改为,全局变量。(因为菜不理解 =-=)。
后来想通了,在此补充下。首先补充以下,引用传参特点(参数改变原值改变)相当于全局变量一般。
为啥要指针引用传参(fun(TreeNode * cur,TreeNode * &pre))
分析代码执行过程。
首先到根节点8,左遍历传参 fun(cur,pre),此时pre为NULL 步骤1
到7节点,左遍历 fun(cur,pre) 此时pre为NULL 步骤2
到5节点,左遍历 fun(cur,pre) 此时pre为NULL 步骤3
到空跳出左遍历。 依次执行 步骤3->步骤2->步骤1
重点
如果没有指针引用传参,执行 步骤3后 到步骤2 pre的值是NULL,因为是步骤2调用步骤3的函数,值传递也不能逆向。
如果指针引用传递,相当于全局指针,步骤3执行后 pre指向5节点,步骤2里的pre也改变。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* pre = NULL;
TreeNode* Convert(TreeNode* pRootOfTree) {
if(!pRootOfTree)return NULL;
fun(pRootOfTree);
TreeNode* tmp = pRootOfTree;
while(tmp->left)
tmp = tmp->left;
return tmp;
}
void fun(TreeNode *cur){
if(!cur)return;
fun(cur->left);
cur->left = pre;
if(pre)pre->right = cur;
pre = cur;
fun(cur->right);
}
};