实现二叉树中序Iterator

https://oj.leetcode.com/problems/binary-search-tree-iterator/

题目

给一二叉树root,实现一个中顺遍历的 Iterator,这个Iterator 具备两个函数。
boolen hasNext(),  返回树是否还有下一个inorder traversal 的节点。
TreeNode next(), 每次调用都返回下一个 inorder traversal 的节点。

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) {
		val = x;
	}
}

分析

#1 最简单的办法是中序遍历一遍二叉树放到List里。是需要O(N)的额外空间,坏处是初始化时间较长,好处是每次next的复杂度是O(1)

#2 把如下非递归中序遍历拆到hasNext与next里面。最坏需要O(N)额外空间,好处是初始化O(1),坏处是最差的next复杂度是O(N)。空间是O(H)。

public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;
        //开始的时候stack为空但是cur指向root
        while(cur != null || !stack.empty()){
            //往左到底
            while(cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            //cur为空,pop
            cur = stack.pop();
            result.add(cur.val);
            //转向右
            cur = cur.right;
        }//first while
        return result;
    }
}
实现

public class Solution{
	private TreeNode cur;
	private Stack<TreeNode> stack = new Stack<TreeNode>();
	public Solution(TreeNode root) {
		cur = root;
	}
	public boolean hasNext() {
		return (cur != null || !stack.empty());
	}
	public TreeNode next() {
		while(cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        TreeNode result = stack.pop();
        cur = result.right;
        return result;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值