Binary Tree Zigzag Level Order Traversal -- LeetCode

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                原题链接:  http://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/  
这道题其实还是树的层序遍历 Binary Tree Level Order Traversal ,如果不熟悉的朋友可以先看看哈。不过这里稍微做了一点变体,就是在遍历的时候偶数层自左向右,而奇数层自右向左。在 Binary Tree Level Order Traversal 中我们是维护了一个队列来完成遍历,而在这里为了使每次都倒序出来,我们很容易想到用栈的结构来完成这个操作。有一个区别是这里我们需要一层一层的来处理(原来可以按队列插入就可以,因为后进来的元素不会先处理),所以会同时维护新旧两个栈,一个来读取,一个存储下一层结点。总体来说还是一次遍历完成,所以时间复杂度是O(n),空间复杂度最坏是两层的结点,所以数量级还是O(n)(满二叉树最后一层的结点是n/2个)。代码如下:
public ArrayList<ArrayList<Integer>> zigzagLevelOrder(TreeNode root) {    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();    if(root==null)        return res;    LinkedList<TreeNode> stack = new LinkedList<TreeNode>();    int level=1;    ArrayList<Integer> item = new ArrayList<Integer>();    item.add(root.val);    res.add(item);    stack.push(root);    while(!stack.isEmpty())    {        LinkedList<TreeNode> newStack = new LinkedList<TreeNode>();        item = new ArrayList<Integer>();        while(!stack.isEmpty())        {            TreeNode node = stack.pop();            if(level%2==0)            {                if(node.left!=null)                {                    newStack.push(node.left);                    item.add(node.left.val);                }                if(node.right!=null)                {                    newStack.push(node.right);                    item.add(node.right.val);                }            }            else            {                if(node.right!=null)                {                    newStack.push(node.right);                    item.add(node.right.val);                }                if(node.left!=null)                {                    newStack.push(node.left);                    item.add(node.left.val);                }                               }        }        level++;        if(item.size()>0)            res.add(item);        stack = newStack;    }    return res;}
上面的算法其实还是一次广度优先搜索,只是在读取每一层结点交替的交换顺序。毕竟面试中像 Binary Tree Level Order Traversal 有时候考得太多了,面试官会觉得你肯定练过,所以会稍作变体,来考察对于编程和算法的基本理解。
           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43418664/article/details/84194867