版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39360985/article/details/82901863
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
通过此题掌握二叉树的知识和Java泛型、栈,队列的使用
题目分析:
此题是一道知识综合题;从返回结果的格式可以看出依然是List中存储List,所以要运用JAVA泛型的知识,可以参考这篇博客JAVA泛型;
题目要求是层次遍历,从底向上,从左至右,遍历的结果我们可以运用队列存储,利用队列先进先出的特性;而最后的结果要从底向上返回,我们则自然想到用栈先进后出的特性。
我之前写的一篇博客二叉树的层次遍历可以作为参考,与此题稍微不同。
代码实现:
public static class TreeNode { int data; TreeNode left; TreeNode right; TreeNode(int val) { data = val; } } public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> list = new ArrayList<>(); Queue<TreeNode> queue = new LinkedList<>(); Stack<List<Integer>> stack = new Stack<>(); if (root != null) { queue.offer(root); } while (!queue.isEmpty()) { //temp初始化要放在此处,每次循环之后要置空 List<Integer> temp = new ArrayList<>(); int level = queue.size(); for (int i = 0; i < level; i++) { if (queue.peek().left != null) queue.offer(queue.peek().left); if (queue.peek().right != null) queue.offer(queue.peek().right); temp.add(queue.poll().data); } stack.push(temp); } while (!stack.isEmpty()) { list.add(stack.pop()); } return list; }
算法分析:
以主函数中的二叉树p为例:
4
/ \
9 20
/ \
15 7
- 根节点不为空,将根节点4入队列;
- 队列不为空,进入while循环,此时level = 1;进入for循环,队列的队首元素节点4的左孩子9和右孩子20不为空,则将它们入队列;并将根节点4出队列加入列表temp,temp = [4];
- 将列表temp入栈(先进后出,很好的实现了自底向上的遍历);
- 队列不空,temp置空(很重要);现在level = 2;进入for循环,第一次循环,队列的队首元素节点9的左孩子和右孩子为空,将9出队列加入列表temp,此时temp = [9];第二次循环,队列的队首元素节点20的左孩子15和右孩子7不为空,则将它们入队列;将20出队列加入列表temp,此时temp = [9,20];
- 循环结束,将temp入栈;此时的栈中状态为:[4],[9,20]
- 队列不空,temp置空;现在level = 2;进入for循环,第一次循环,队列的队首元素节点15的左孩子和右孩子为空,将15出队列加入列表temp,此时temp = [15];第二次循环,队列的队首元素节点7的左孩子和右孩子为空,则将7出队列加入列表temp,此时temp = [15,7];
- 循环结束,将temp入栈;此时的栈中状态为:[4],[9,20],[15,7]
- 队列为空,while循环结束;栈不为空,将栈中的元素出栈并加入列表list;
- 最后返回的结果就是:[15,7],[9,20],[4]
主函数:
public static void main(String[] args) { TreeNode p = new TreeNode(4); p.left = new TreeNode(9); p.right = new TreeNode(20); p.right.left = new TreeNode(15); p.right.right = new TreeNode(7); Tree11 t = new Tree11(); List<List<Integer>> list= t.levelOrderBottom(p); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + " "); } }
运行结果:
[15, 7], [9, 20], [4]