二叉树的层次遍历II

版权声明:本文为博主原创文章,未经博主允许不得转载。 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
  1. 根节点不为空,将根节点4入队列;
  2. 队列不为空,进入while循环,此时level = 1;进入for循环,队列的队首元素节点4的左孩子9和右孩子20不为空,则将它们入队列;并将根节点4出队列加入列表temp,temp = [4];
  3. 将列表temp入栈(先进后出,很好的实现了自底向上的遍历);
  4. 队列不空,temp置空(很重要);现在level = 2;进入for循环,第一次循环,队列的队首元素节点9的左孩子和右孩子为空,将9出队列加入列表temp,此时temp = [9];第二次循环,队列的队首元素节点20的左孩子15和右孩子7不为空,则将它们入队列;将20出队列加入列表temp,此时temp = [9,20];
  5. 循环结束,将temp入栈;此时的栈中状态为:[4],[9,20]
  6. 队列不空,temp置空;现在level = 2;进入for循环,第一次循环,队列的队首元素节点15的左孩子和右孩子为空,将15出队列加入列表temp,此时temp = [15];第二次循环,队列的队首元素节点7的左孩子和右孩子为空,则将7出队列加入列表temp,此时temp = [15,7];
  7. 循环结束,将temp入栈;此时的栈中状态为:[4],[9,20],[15,7]
  8. 队列为空,while循环结束;栈不为空,将栈中的元素出栈并加入列表list;
  9. 最后返回的结果就是:[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]

猜你喜欢

转载自blog.csdn.net/qq_39360985/article/details/82901863