利用线索二叉树进行中序遍历
算法菜🐔久违的又开始刷leetcode了。
在leetcode 99. Recover Binary Search Tree中,题目描述提示有常数空间的解法,百思不得其解,遂放弃,转而搜索题解。
进而发现一种非递归不用栈的遍历二叉树的方法Morris Traversal
,使用它可以实现中序遍历。
大概意思是构建一个线索二叉树,将所有为空的右子节点指向中序遍历的下一个节点,这样中序遍历完左子结点后,就能顺利的回到其根节点继续遍历。
在leetcode 94. Binary Tree Inorder Traversal AC 的代码如下:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
TreeNode *cur = root, *pre = NULL;
while(cur) {
if(!cur->left) {
res.push_back(cur->val);
cur = cur->right;
} else {
// 找到cur的左节点的最右子节点
pre = cur->left;
while(pre->right && pre->right != cur) pre = pre->right;
if(pre->right) { // 若最右子节点存在右节点,该link必定是后加入的“线索”(pre->right == cur),这表明cur的左子树已遍历完成,因此我们去掉该线索,继续遍历右子树
pre->right = NULL;
res.push_back(cur->val);
cur = cur->right;
} else { // 若最右子节点不存在右节点,添加一条“线索”,以便遍历完回到cur根节点
pre->right = cur;
cur = cur->left;
}
}
}
return res;
}
};