Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
We can use the same idea as level order traversal, just reverse the traversal list when current level is even.
C++ Code:
/* * func: get_height * goal: get the height of the binary tree * @param root: root node of the tree * return: the height of the tree */ int get_height(TreeNode *root){ if(root == nullptr){ return 0; }else{ int left_height = get_height(root->left); int right_height = get_height(root->right); return left_height > right_height ? left_height + 1 : right_height + 1; } } /* * func: traverse_given_level * goal: traverse the given level * @param root: root node of the tree * @param level: given level * @param routine: traversal list * return: */ void traverse_given_level(TreeNode *root, int level, vector<int> &routine){ if(root == nullptr){ return; } if(level == 1){ routine.emplace_back(root->val); }else if(level > 1){ traverse_given_level(root->left, level-1, routine); traverse_given_level(root->right, level-1, routine); } } /* * func: zigzag_level_order * goal: traverse the tree in zigzag level order * @param root: root node of the tree * return: a vector of each level */ vector<vector<int> > zigzag_level_order(TreeNode *root){ int level = get_height(root); vector<int> curr_level; vector<vector<int> > result; for(int i=1; i <= level; ++i){ traverse_given_level(root, i, curr_level); if(i & 1) result.emplace_back(curr_level); else{ reverse(curr_level.begin(), curr_level.end()); result.emplace_back(curr_level); } curr_level.clear(); } return result; }
Python Code:
# func: traverse tree in zig zag level order # @param root: root node of the tree # @return: a list of nodes in level order def zigzag_level_order(root): if not root: return [] result = [] curr_level = [root] level = 1 while curr_level: if level & 1 == 0: result.append([x.val for x in curr_level[::-1]]) else: result.append([x.val for x in curr_level]) result.append([x.val for x in curr_level]) next_level = [] for node in curr_level: if node.left: next_level.append(node.left) if node.right: next_level.append(node.right) curr_level = next_level[:] level += 1 return result
No comments:
Post a Comment