题解 | 二叉搜索树与双向链表
二叉搜索树与双向链表
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; } };
栈来进行中序遍历的逻辑是把左边的全部搞进去,之后每次弹出一个,表示下面的左树已经处理完全了。
此时处理当前节点,处理结束后再把右边的树入栈。
对于每一个节点本身及该节点的右子树和更下方节点(左子树),都是先入栈节点的左子树的部分