算法题-将Android的view内的控件全部涂成红色 2020-05-09 算法 解题思路分析需求,Android的view是树形结构,所以问题可以转换成树的遍历。树的遍历分为递归和非递归,面试通常要求用非递归实现 递归123456789public void recurTraverse(View v) { v.setBackgroundColor(0xF00); if (v instanceof ViewGroup) { ViewGroup group = (ViewGroup) v; for (int i = 0, len = group.getChildCount(); i < len; i++) { recurTraverse(group.getChildAt(i)); } }} 非递归递归遍历的问题在于方法调用本身存在一个函数栈,如果树的层级特别深,程序会存在栈溢出的风险StackOverflowException.树的非递归遍历有多种方式,主要是栈和队列的应用,这里使用层序遍历的方式 123456789101112131415public void unRecurTraverse(View v) { Queue<View> queue = new LinkedList<>(); queue.offer(v); while (!queue.isEmpty()) { View view = queue.poll(); view.setBackgroundColor(0xF00); if (v instanceof ViewGroup) { ViewGroup group = (ViewGroup) v; for (int i = 0, len = group.getChildCount(); i < len; i++) { View child = group.getChildAt(i); queue.offer(child); } } }} 前一篇 apidocjs生成api文档实践 后一篇 Dagger2总结