美文网首页算法提高之LeetCode刷题数据结构和算法分析
二叉查找树迭代器Super Star:O(1)的额外空间复杂度挑

二叉查找树迭代器Super Star:O(1)的额外空间复杂度挑

作者: FindCrt | 来源:发表于2018-08-11 17:47 被阅读5次

    题目地址:LeetCode 86. 二叉查找树迭代器

    核心思路是:把left节点指向parent。因为是中序遍历,而且使用深度搜索的方式,当搜索走到某个节点时,它的左节点整个子树的内容都已经遍历完成,不需要了。

    class BSTIterator {
        TreeNode *cur = new TreeNode(0);
        TreeNode *parent = nullptr;
        //找到子树的第一个节点,也就是最左边的节点,并且在遍历过程中翻转left指针指向parent
        inline void findTreeFirst(){
            auto left = cur->left;
            cur->left = parent;
            
            while (left) {
                parent = cur;
                cur = left;
                left = cur->left;
                cur->left = parent;
            }
        }
        
    public:
        
        BSTIterator(TreeNode * root) {
            cur->right = root;
        }
    
        bool hasNext() {
            if (cur->right) {
                return true;
            }
            auto check = cur;
           //看是父节点里是否还有一个是左孩子的,左孩子的父节点在中序遍历靠后,就还需要继续处理,否则结束
            while (check->left && check->left->right == check) {
                check = check->left; //实际是去到parent
            }
            return check->left != nullptr;
        }
    
        TreeNode * next() {
            if (cur->right) {
                parent = cur;
                cur = cur->right;
                findTreeFirst();
            }else{
                //cur是右孩子,就要一直向上追溯,知道父节点为空,或者找到cur是左孩子。因为右孩子的父节点在中序遍历里是靠前的,它已经遍历结束。
                while (cur->left && cur->left->right == cur) {
                    cur = cur->left; //实际是去到parent
                }
                cur = cur->left;
            }
            
            return cur;
        }
    };
    
    测试结果:

    相关文章

      网友评论

        本文标题:二叉查找树迭代器Super Star:O(1)的额外空间复杂度挑

        本文链接:https://www.haomeiwen.com/subject/dnidbftx.html