二叉树的之字形层次遍历

目录

  • 1、之字形层序遍历
  • 2、代码实现
    • 2.1两个栈实现二叉树的层次遍历

1、之字形层序遍历

二叉树的之字形层次遍历_第1张图片如上如二叉树,之字形层序遍历:
第一层:从左至右 打印A
第二层:从右至左 打印GB
第三层:从左至右 打印CDH
第四层:从右至左 打印FE

2、代码实现

2.1两个栈实现二叉树的层次遍历

以第一层和第二层遍历为例:
第一层:
step1: 根节点入栈stack1,stack2为空,从左至右遍历;stack1或者stack2不为空,进入step2;
step2: 存放当前层元素的栈为stackCurrent,存放下一层元素的栈为stackNext,
stackCurrent = stack1(不为空,A); stackNext = stack2(为空);
step3: stackCurrent 中元素按序出栈,添加到res([A])中,从左至右将出栈元素的左右节点入栈stackNext;
step4: stack1 =stackNext(不空,BG);stack2 = stackCurrent(为空);转换遍历方向从右至左
第二层:
step1: stack1或者stack2不为空,进入step2;
step2: stackCurrent = stack1(不为空,BG); stackNext = stack2(为空);
step3: stackCurrent 中元素按序出栈,添加到res中,从右至左将出栈元素的左右节点入栈stackNext;
step4: stack1 =stackNext(不空,HDC);stack2 = stackCurrent(为空);转换遍历方向从左至右

public ArrayList<ArrayList<Character>> zigzagLevelOrder (TreeNode root) {
     
    // write code here
    ArrayList<ArrayList<Character>> res = new ArrayList<>();
    if(root == null) return res;
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    Boolean leftToRight = true;
    TreeNode ptr = root;
    stack1.push(ptr);
    while(!stack1.empty()||!stack2.empty()){
     
        Stack<TreeNode> stackCurrent = stack2.empty()?stack1:stack2;
        Stack<TreeNode> stackNext = stack2.empty()?stack2:stack1;
        res.add(new ArrayList<>());
        while(!stackCurrent.empty()){
     
            ptr = stackCurrent.pop();
            res.get(res.size()-1).add(ptr.val);
            if(leftToRight == false){
     
                pushNode(stackNext,ptr.right);
                pushNode(stackNext,ptr.left);
            }else{
     
                pushNode(stackNext,ptr.left);
                pushNode(stackNext,ptr.right);
            }
        }
        stack1 = stackCurrent.empty()?stackNext:stackCurrent;
        stack2 = stackCurrent.empty()?stackCurrent:stackNext;
        leftToRight = !leftToRight;
    }
    return res; 
}

private void pushNode(Stack<TreeNode> stackNext, TreeNode node) {
     
    if(node != null){
     
        stackNext.push(node);
    }
}

你可能感兴趣的:(数据结构,二叉树)