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

二叉搜索树与双向链表

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

解法1:中序遍历,将节点放到vector中,再改链接关系

class Solution 
{
public:
	vector<TreeNode*> v;
	void InOrder(TreeNode* root) 
	{
		if(root == nullptr)		return;
		InOrder(root->left);
		v.push_back(root);
		InOrder(root->right);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) 
	{
		if(pRootOfTree==nullptr)	return nullptr;
		InOrder(pRootOfTree);
		int n = v.size();
		for(int i=0;i<n;++i) {
			auto x = v[i];
			if(i==0) {
				x->left=nullptr;
				x->right=v[i+1];
			}
			else if(i==n-1) {
				x->left=v[i-1];
				x->right=nullptr;
			}
			else {
				x->left=v[i-1];
				x->right=v[i+1];
			}
		}
		return v[0];
    }
};

解法2:直接在树上处理

class Solution 
{
public:
	// 只有一个prev,如果不加引用每次递归建立栈帧的时候prev不会改变
	void InOrderConvert(TreeNode* cur, TreeNode*& prev) 
	{
		if(cur==nullptr)	return;
		InOrderConvert(cur->left, prev);
		cur->left=prev;
		if(prev != nullptr)		prev->right=cur;
		prev=cur;
		InOrderConvert(cur->right, prev);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) 
	{
		// 找到最左节点
		auto head = pRootOfTree;
		while(head && head->left != nullptr)	
			head=head->left;
		TreeNode* prev = nullptr;
		InOrderConvert(pRootOfTree, prev);
		return head;
    }
};

全部评论

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务