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

二叉搜索树与双向链表

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;//异常空指针或者到底了
		stack<TreeNode*> st;//我不是很确定自定义类型能够执行stack的所有功能,有兴趣可以查一下
		TreeNode* head = nullptr;//置为空指针保证安全
		TreeNode* pre = nullptr;
		while(!st.empty()||pRootOfTree){//对于指针来说可以直接使用!,它可以作为
			while(pRootOfTree){
				st.push(pRootOfTree);
				pRootOfTree = pRootOfTree->left;
			}
			pRootOfTree = st.top();
			st.pop();
			if(head==nullptr){
				head = pRootOfTree;
				pre = pRootOfTree;
			}
			else{
				pre->right = pRootOfTree;
				pRootOfTree->left = pre;
				pre = pRootOfTree;
			}
			pRootOfTree = pRootOfTree->right;
		}
		return head;
    }
};

栈来进行中序遍历的逻辑是把左边的全部搞进去,之后每次弹出一个,表示下面的左树已经处理完全了。

此时处理当前节点,处理结束后再把右边的树入栈。

对于每一个节点本身及该节点的右子树和更下方节点(左子树),都是先入栈节点的左子树的部分

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-18 14:29
牛客604067584号:感觉算法卷的人少很多,毕竟只有一部分bg还不错的硕士才会考虑算法,虽然hc不如后端,但是竞争真的少很多。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务