leetcode104[二叉树的层次遍历]

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其自底向上的层次遍历为:

[
  [15,7],
  [9,20],
  [3]
]

思路:利用栈和队列的性质。

根节点不为空,将其入列,循环遍历每一层节点。

从左向右遍历当前层,该层的节点数为队列中的元素数。将当前节点的非空左右子树分别进队列中,然后当前节点出队列,将其值保存在数组中。遍历完该层节点后将数组入栈,清空数组,进行下一层的遍历。

自顶向下遍历并将每一层的节点值数组存储在栈中,队列为空时遍历完成,弹出栈的顺序就是自底向上遍历的顺序。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        Stack<List<Integer>> stack = new Stack<>();
        if(root!=null)
            queue.offer(root);

        while(!queue.isEmpty()){
            List<Integer> temp = new ArrayList<>();
            int size = queue.size();

            for(int i =0;i<size;++i)
            {
                TreeNode node = queue.poll();                
                if(node.left!=null)
                    queue.offer(node.left);
                if(node.right!=null)
                    queue.offer(node.right);
                temp.add(node.val);
            }
            stack.push(temp);
        }  
        while(!stack.empty())  
            ans.add(stack.pop());
        return ans;
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章