您的位置:首页 > 其它

lintcode: 二叉树的锯齿形层次遍历

2016-01-13 11:44 309 查看
题目

二叉树的锯齿形层次遍历

给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)

样例

给出一棵二叉树
{3,9,20,#,#,15,7}
,

3
/\
920
/\
157

返回其锯齿形的层次遍历为:

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

解题
交叉着走,受上面两题的影响,考虑用队列,发现不可以,换成栈,发现只用一个栈的话也不可以,(一个栈也能对71%的测试数据)在入栈和出栈的时候,出现了混乱,考虑用两个栈。
下面是自己写的程序,代码写的好燋灼。。。<恶棍天使台词>
关键点:两个栈交叉着进,交叉的出


/**
*DefinitionofTreeNode:
*publicclassTreeNode{
*publicintval;
*publicTreeNodeleft,right;
*publicTreeNode(intval){
*this.val=val;
*this.left=this.right=null;
*}
*}
*/

publicclassSolution{
/**
*@paramroot:Therootofbinarytree.
*@return:Alistoflistsofintegerinclude
*thezigzaglevelordertraversalofitsnodes'values
*/
publicArrayList<ArrayList<Integer>>zigzagLevelOrder(TreeNoderoot){
//writeyourcodehere
ArrayList<ArrayList<Integer>>tree=newArrayList<ArrayList<Integer>>();
if(root==null)
returntree;
//rightstack出栈序列是左到右该层元素
Stack<TreeNode>leftstack=newStack<TreeNode>();
leftstack.push(root);

//leftstack出栈序列是右到左该层元素
Stack<TreeNode>rightstack=newStack<TreeNode>();
booleanleft=true;
while(!leftstack.empty()||!rightstack.empty()){
ArrayList<Integer>list=newArrayList<Integer>();
if(left){
intsize=leftstack.size();
for(inti=0;i<size;i++){
TreeNodenode=leftstack.pop();
list.add(node.val);
if(node.left!=null)
rightstack.push(node.left);
if(node.right!=null)
rightstack.push(node.right);

}
}else{
intsize=rightstack.size();
for(inti=0;i<size;i++){
TreeNodenode=rightstack.pop();
list.add(node.val);
if(node.right!=null)
leftstack.push(node.right);
if(node.left!=null)
leftstack.push(node.left);

}
}
left=!left;
tree.add(list);
}
returntree;
}
}


JavaCode
九章程序好像简洁了一些


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: