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

二叉搜索树与双向链表

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:
	//
	void InOrder(TreeNode* root,TreeNode*& prev)
	{
		if(root == nullptr)
		return;

		InOrder(root->left,prev);
		root->left = prev;
		if(prev)
		prev->right = root;
		prev = root;

		InOrder(root->right,prev);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) {
        TreeNode* prev = nullptr;

		if(pRootOfTree == nullptr)
		return nullptr;
		InOrder(pRootOfTree,prev);

		TreeNode* cur = pRootOfTree;
		while(cur->left)
		{
			cur = cur->left;
		}
		return cur;
    }
};

通过中序遍历,来修改结点的指向。因为要求的双向链表是升序的,所以二叉树 改为 双向链表后,修改时有以下特点:

1.修改二叉树的left为前驱

2.修改二叉树的right为后继

在一层递归中:

修改二叉树的left为前驱:root->left = prev

修改二叉树的right为后继:由于下一个结点未知,所以不知道后继为哪一个结点。但是可以通过prev修改上一层结点的后继。

因此prev->right = root

最后,通过根结点找到头结点。返回即可

全部评论

相关推荐

11-03 17:42
门头沟学院 Java
点赞 评论 收藏
分享
天降大厂offer:想从事前端就放前端的技术栈,然后项目描述,还有项目做了什么内容,使用了什么技术解决了什么问题优化了什么性能。然后头像可以不要,在读也可以不要,还有bg的话就不要放课程,写哪个学校什么本科,还有绩点排名(如果高的话),然后就是技术栈写好一点,接下来就是项目(有实习就写实习,没有就到项目),项目放两个好一点的,自己包装一下,然后有参加什么竞赛放两个就好了,接下来就是靠你自己了,毕竟211还是很难容易找的,不像我们学院本
点赞 评论 收藏
分享
10-16 15:48
算法工程师
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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