美文网首页
二叉树zigzag层级遍历

二叉树zigzag层级遍历

作者: android_hcf | 来源:发表于2020-04-14 10:16 被阅读0次
如图: 图片.png
返回结果:
[
  [3],
  [20,9],
  [15,7]
]

通过分析,我的解法思路为:
1.先定义两个堆栈,然后将根节点放入堆栈A;
2.每次将不为空的一个栈的内容全部出栈,然后将当前层级下的子节点放入另一个堆栈当中;其中堆栈A读取子节点顺序为先左后右,堆栈B先右后左,保证每相邻层间读取顺序为反;
3.如果堆栈A和B均为空,则表明树已遍历完毕;

以如下二叉树为例:


图片.png 图片.png

代码如下:

public static void main(String[] args) {
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);
        TreeNode node7 = new TreeNode(7);
        TreeNode node2 = new TreeNode(2, node4, node5);
        TreeNode node3 = new TreeNode(3, node6, node7);
        TreeNode node1 = new TreeNode(1, node2, node3);
        
        
        Stack<TreeNode> stack1 = new Stack<>();
        stack1.add(node1);
        zigzagLevelOrder(stack1, new Stack<TreeNode>());
    }
    
    private static void zigzagLevelOrder(Stack<TreeNode> stack1, Stack<TreeNode> stack2) {
        while(!stack1.isEmpty() || !stack2.isEmpty()) {         
            while(!stack1.isEmpty()) {
                TreeNode tn = stack1.peek();
                System.out.print(tn.value+"、");
                // 从左往右遍历子节点
                if (tn.left != null) {
                    stack2.push(tn.left);
                }
                if (tn.right != null) {
                    stack2.push(tn.right);
                }
                stack1.pop();
            }
            System.out.println();
            
            while(!stack2.isEmpty()) {
                TreeNode tn = stack2.peek();
                System.out.print(tn.value+"、");
                // 从右往左遍历子节点
                if (tn.right != null) {
                    stack1.push(tn.right);
                }
                if (tn.left != null) {
                    stack1.push(tn.left);
                }
                stack2.pop();
            }
            System.out.println();
        }
    }

该算法引入了堆栈,一共需要额外存储n个空间备份,故空间复杂度为o(n),时间复杂度也为o(n)。

相关文章

  • [LeetCode OJ]- Binary Tree Zigz

    题目要求:求一颗二叉树的有底向上的zigzag层次遍历,返回遍历结果。zigzag就是先从左往右,再从右往左;如此...

  • 二叉树zigzag层级遍历

    如图: 通过分析,我的解法思路为:1.先定义两个堆栈,然后将根节点放入堆栈A;2.每次将不为空的一个栈的内容全部出...

  • 算法小结

    算法小结 1 二叉树 定义树节点形式 1.1 层序遍历 语义解析:层序遍历指的是二叉树根据层级进行遍历。 利用队列...

  • 2019-08-04-二叉树遍历算法

    1,前序遍历 2,中序遍历 3,后序遍历 4,队列层级遍历 5,计算二叉树节点数 一,首先定义一个二叉树的节点 二...

  • 大话数据结构—二叉树(十)

    1.二叉树3种递归遍历 2.层级遍历 引用原文:https://www.cnblogs.com/llguanli/...

  • 二叉树续

    199. 二叉树的右视图 层级遍历取每层最后一个

  • 面试总结算法

    二叉树镜像 最长回文子串 二叉树层级遍历 整数反转 二叉树先序遍历 二分法 连续子数组的最大和 动态规划 sync...

  • 二叉树输出第K层节点元素

    这个问题我的第一反应是应该跟 二叉树的层级遍历 有关。 定义节点 回顾一下层级遍历 使用了一个 队列,通过入列和...

  • (补)第四周算法备忘

    深度优先, DFS 前中后序遍历二叉树 典型题目 岛屿问题 八皇后问题 广度优先, BFS 层级遍历n叉树 典型题...

  • 二叉树层级遍历

    LintCode 二叉树层级遍历 解题思路:队列(先进先出) 将每层的节点插入到队列中, 然后遍历队列,再将下一层...

网友评论

      本文标题:二叉树zigzag层级遍历

      本文链接:https://www.haomeiwen.com/subject/ooxnmhtx.html