遍历二叉树操作
1.Binary Tree Zigzag Level Order Traversal
- 题目要求
按之字形遍历二叉树(按层遍历的一种) - 解题思路
思路一:使用递归的方法,当节点所在层为偶数,则下一层的节点按从右往左的顺序,向前插入节点;当节点所在层是奇数,向后插入。
List<List<Integer>> list = new ArrayList<>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root == null)
return list;
travel(root, 0);
return list;
}
public void travel(TreeNode root, int level){
if(root == null)
return;
if(list.size() <= level){
List<Integer> var = new ArrayList<>();
list.add(var);
}
if(level%2 == 0){
list.get(level).add(root.val);
}else{
list.get(level).add(0,root.val);
}
travel(root.left, level + 1);
travel(root.right, level + 1);
}
思路二:使用两个栈,遍历一层时,将下一层的节点放到下一个栈中。交替访问两个栈。
List<List<Integer>> list = new ArrayList<>();
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
if(root == null)
return list;
Stack<TreeNode> stack1= new Stack<>();
Stack<TreeNode>stack2= new Stack<>();
stack1.add(root);
while(!stack1.isEmpty() || !stack2.isEmpty()){
List<Integer> var = new ArrayList<>();
if(!stack1.isEmpty() && stack2.isEmpty()){
while(!stack1.isEmpty()){
TreeNode node = stack1.peek();
var.add(node.val);
if(node.left != null)
stack2.add(node.left);
if(node.right != null)
stack2.add(node.right);
stack1.pop();
}
}else if(stack1.isEmpty() && !stack2.isEmpty()){
while(!stack2.isEmpty()){
TreeNode node = stack2.peek();
var.add(node.val);
if(node.right != null)
stack1.add(node.right);
if(node.left != null)
stack1.add(node.left);
stack2.pop();
}
}
list.add(var);
}
return list;
}