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

二叉搜索树与双向链表

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的作用。

注意不用的指针都先给置为空指针比较好,避免产生悬空指针问题。

全部评论

相关推荐

04-21 13:50
已编辑
北京理工大学 硬件测试
我们学校连夜发了声明,绝了绝了!看完了全部ppt,震碎三观。一般情况下我是站学生的,但这不是一般情况。这男的不能被取消学位吗?自己吃到了红利,靠着面试泄题得到的保研,又反手举报导师。这导师是《被举报系列》里最惨最恋爱脑的了,当然最可怜的是他的同妻……
牛客小黄鱼:看了ppt的聊天记录,真不知道谁才是受害者!有人为你剥过柚子吗?有人为你雪地里等你吗?有人为你写过情书吗?有人为你规划未来吗?有人为你小心翼翼吗?有人为你整页失眠失眠吗? 有人为你送上自己的科研成果吗?有人为你安排出国留学吗?有人愿意给你一个月2万吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务