Loading

利用线索二叉树进行中序遍历

算法菜🐔久违的又开始刷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;
    }
};

参考文献

1
2

posted @ 2021-08-27 10:27  lkltcl  阅读(142)  评论(0编辑  收藏  举报