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

二叉搜索树与双向链表

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;
    }
};

全部评论

相关推荐

爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务