题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

二叉搜索树和双向链表(大佬的思路,萌新望尘莫及)

把原来大佬的指针引用传递改为,全局变量。(因为菜不理解 =-=)。

后来想通了,在此补充下。首先补充以下,引用传参特点(参数改变原值改变)相当于全局变量一般。

alt

为啥要指针引用传参(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);
    }
};
全部评论

相关推荐

05-29 20:34
门头沟学院 C++
KarlAllen_直通春招版:得做好直接春招的准备。学历差的话,一是面试要求会比学历好的严格不少,二是就算面试通过了也会被排序。总之暑期和秋招对于学历差的就是及其不友好
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务