173. Binary Search Tree Iterator

二叉搜索树的中序遍历,定义一个self.p指针,永远指向下一个节点。思路是左边的节点全部一次性进栈,完成后,pop最上面的节点A,检查它是否有右节点,如果有的话就作为下一个遍历的根节点,因为此节点的值大于A小于A的父节点。如果A没有右节点,说明没有值在A和A的父节点之间,那么直接popA的父节点作为答案。

class BSTIterator(object):

    def __init__(self, root):
        """
        :type root: TreeNode
        """
        self.stack = []
        self.p = root
        while self.p:
            self.stack.append(self.p)
            self.p = self.p.left


    def next(self):
        """
        @return the next smallest number
        :rtype: int
        """
        if self.stack or self.p:
            while self.p:
                self.stack.append(self.p)
                self.p = self.p.left
            else:
                next_node = self.stack.pop()
                self.p = next_node.right
                return next_node.val if next_node else None

    def hasNext(self):
        """
        @return whether we have a next smallest number
        :rtype: bool
        """
        if not self.stack and not self.p:
            return False
        return True

java用linkedlist做,注意判空不要直接像python一样和null比较。。

class BSTIterator {
    private LinkedList<TreeNode> stack;
    private TreeNode root;

    public BSTIterator(TreeNode root) {
        stack = new LinkedList<>();
        this.root = root;
        while (this.root != null) {
            stack.push(this.root);
            this.root = this.root.left;
        }
    }

    /**
     * @return the next smallest number
     */
    public int next() {
        if (!stack.isEmpty() || root != null) {
            while (root != null) {
                stack.push(root);
                root = root.left;
            }
            if (root == null) {
                TreeNode nextNode = stack.pop();
                root = nextNode.right;
                return nextNode.val;
            }
        }
        return 0;
    }

    /**
     * @return whether we have a next smallest number
     */
    public boolean hasNext() {
        if (stack.isEmpty() && root == null) {
            return false;
        }
        return true;
    }
}

一个例子:检查左边的None后pop(1),检查右边的None后pop(3)

inorder的递归写法,思路就是按照左中右的处理顺序(左边处理完了,将左边的节点放入结果,上述图例中按照1111231...的顺序执行)

    def inorderTraversal(self, root):
        res = []
        self.dfs(root, res)
        return res

    def dfs(self, root, res):
        if not root:
            return

        self.dfs(root.left, res)  #1
        res.append(root.val)      #2
        self.dfs(root.right, res) #3

results matching ""

    No results matching ""