题目描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
分析思路
1.双端队列
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
q=collections.deque()
q.append(root)
mark=0
res=[]
while q:
level=[]
if mark%2==0:
for _ in range(len(q)):
node=q.popleft()
level.append(node.val)
if node.left: q.append(node.left)
if node.right: q.append(node.right)
res.append(level)
else:
for _ in range(len(q)):
node=q.pop()
level.append(node.val)
if node.right: q.appendleft(node.right)
if node.left: q.appendleft(node.left)
res.append(level)
mark+=1
return res
2.两个栈实现
python:
def Print( pRoot):
# write code here
res = []
if pRoot == None:
return res
stack1 = []
stack2 = []
stack1.append(pRoot)
level = []
while stack1 or stack2:
while stack1:
cur = stack1[-1]
if cur.left != None:
stack2.append(cur.left)
if cur.right != None:
stack2.append(cur.right)
level.append(cur.val)
stack1.pop()
if level:
res.append(level)
level = []
while stack2:
cur = stack2[-1]
if cur.right != None:
stack1.append(cur.right)
if cur.left != None:
stack1.append(cur.left)
level.append(cur.val)
stack2.pop()
if level:
res.append(level)
level = []
return res
c++
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
if (pRoot==NULL)
return res;
stack<TreeNode*> stack1,stack2;
stack1.push(pRoot);
vector<int> tmp;
while(!stack1.empty() || !stack2.empty()){
TreeNode* cur=nullptr;
while(!stack1.empty()){
cur=stack1.top();
if(cur->left !=NULL)
stack2.push(cur->left);
if(cur->right !=NULL)
stack2.push(cur->right);
tmp.push_back(cur->val);
stack1.pop();
}
if(tmp.size()){
res.push_back(tmp);
tmp.clear();
}
while(!stack2.empty()){
cur=stack2.top();
if(cur->right !=NULL)
stack1.push(cur->right);
if(cur->left !=NULL)
stack1.push(cur->left);
tmp.push_back(cur->val);
stack2.pop();
}
if(tmp.size()){
res.push_back(tmp);
tmp.clear();
}
}
return res;
}
3.输出结果
完整例子如下
def Print(pRoot):
# write code here
res = []
if pRoot == None:
return res
stack1 = []
stack2 = []
stack1.append(pRoot)
while stack1 or stack2:
while stack1:
cur = stack1[-1]
if cur.left != None:
stack2.append(cur.left)
if cur.right != None:
stack2.append(cur.right)
res.append(cur.val)
stack1.pop()
while stack2:
cur = stack2[-1]
if cur.right != None:
stack1.append(cur.right)
if cur.left != None:
stack1.append(cur.left)
res.append(cur.val)
stack2.pop()
return res
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def main():
t1 = TreeNode(1)
t2 = TreeNode(2)
t3 = TreeNode(3)
t4 = TreeNode(4)
t5 = TreeNode(5)
t6 = TreeNode(6)
t7 = TreeNode(7)
t1.left = t2
t1.right = t3
t2.left = t4
t2.right = t5
t3.left = t6
t4.right = t7
print(Print(t1))
if __name__ == "__main__":
main()