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

二叉搜索树与双向链表

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

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

全部评论

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务