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

二叉搜索树与双向链表

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* Convert(TreeNode* pRootOfTree) {
		if(pRootOfTree==nullptr){
			return nullptr;
		}
		TreeNode * ret=dfs(pRootOfTree);
		TreeNode * retlast=ret->left;
		retlast->right=nullptr;
		ret->left=nullptr;

		return ret;

    }
	TreeNode * dfs(TreeNode * pRootOfTree){
		if(pRootOfTree==nullptr){
			return nullptr;
		}
	
		TreeNode * left=dfs(pRootOfTree->left);
		TreeNode * right=dfs(pRootOfTree->right);
		TreeNode * start=pRootOfTree;
		TreeNode * end=pRootOfTree;
		
		if(left!=nullptr){
			TreeNode * leftLast=left->left;
			leftLast->right=pRootOfTree;
			pRootOfTree->left=leftLast;
		//	left->left=nullptr;
			start=left;
		}//middle
		//process right sub tree
		//将中间节点拼接到右边子树的开头,把末尾和开头相连。
		if(right!=nullptr){
			TreeNode * rightLast=right->left;
			pRootOfTree->right=right;
			right->left=pRootOfTree;
			end=rightLast;
		}

		start->left=end;
		end->right=start;

		return start;
	}
};

递归,关键是确定好三种条件:

1.主节点nullptr

2.左右子节点nullptr的情况

3.考虑递归到最下层节点的情况

总之,

1.等价于处理左子树,生成链表

2.处理右子树,生成链表

3.中间节点接在左子树末端,再接到右子树首端

4.既然都是返回头结点或者尾节点,怎么才能获取左子树末端的情况?

确认返回的是循环链表。

所以算法是

1.生成循环链表,从小到大,返回头

2.同样

3.中间节点接好

4.返回循环链表

5.最外一层,调用,并且解开。

全部评论

相关推荐

内向的柠檬精在研究求职打法:你们广东工业大学为啥这么多字节,好吓人,还有那个东北大学,重庆邮电,太哈人了
点赞 评论 收藏
分享
03-26 13:44
南华大学 Java
在看面经的花生米很野蛮:这种情况下你当然要回答,你也是吗!!!!我超喜欢他的XXXXX
点赞 评论 收藏
分享
xxxxOxo:该催就催,想要你的不会因为催就挂,催了就挂的是因为本来就要挂你
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务