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

二叉搜索树与双向链表

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.最外一层,调用,并且解开。

全部评论

相关推荐

king122:实习经历可以重点写这里这里写的清晰一点,分点写。技能特长一般是放在上面的,而且你的实习经历不能只写实现了一些简单的接口,你要去写一些难点和亮点。甚至可以写一些数字指标上去,只要你能配合业务讲出来,根据我说的这些自己简单包装一下,面试应该会更多,至于笔试和八股,那就只能纯靠自己了,对项目包装感兴趣可以找我
点赞 评论 收藏
分享
吴offer选手:我卡在笔试才是最好笑的,甚至没给我发过笔试链接
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务