美文网首页算法提高之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)的额外空间复杂度挑

    题目地址:LeetCode 86. 二叉查找树迭代器 核心思路是:把left节点指向parent。因为是中序遍历,...

  • 查找/索引技术

    查找算法平均时间复杂度空间复杂度查找条件顺序查找O(n)O(1)无序/有序二分查找O(log2n)O(1)有序二叉...

  • 八大排序算法之堆排序

    时间复杂度:O(Nlog(N))额外空间复杂度:O(1)是否可实现稳定性:否 思路: 把数组逻辑上看成一个二叉树,...

  • Morris遍历

    二叉树前中后序的递归和非递归实现时间复杂度O(N),额外空间复杂度O(h),h是树高度。如果树很棒状那么O(h)接...

  • 700. Search in a Binary Search T

    二叉搜索树中查找元素 时间复杂度为:O(H),H为树的高度,平均时间复杂度O(logN),最坏时间复杂度O(N) ...

  • 复杂链表的复制

    时间复杂度为O(n),需要额外空间O(n) 时间复杂度O(n),无额外空间

  • 10.算法设计思想之"分而治之"

    时间复杂度 O(logN) && 空间复杂度 O(n) LeeCode:226.翻转二叉树 时间复杂度 O(n) ...

  • morris traversal-建好线索再行遍历 2020-0

    1.morris traversal 莫里斯遍历,是在O(n)时间复杂度和O(1)空间复杂度下实现的二叉树遍历,带...

  • 查找算法

    顺序查找 时间复杂度O(n) 折半查找(二分查找) 时间复杂度O(logn) 把n个数化为一颗二叉树输的高度为l...

  • 二叉树的Morris遍历

    前言 前面已经进行过二叉树的递归遍历和迭代遍历,在前两种遍历中,二叉树遍历的空间复杂度都是O(n),这是因为不管是...

网友评论

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

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