Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
Since the next node is the next node of a pre-order traversal, we can solve this recursively. We can convert its right subtree first, and then convert its left subtree. Finally concatenate them all to the right side.
C++ Code:
/* * func: flatten_binary_tree_helper * goal: recursive helper function to flatten the tree * @param root: current root node of the tree * return: root node after flatten */ TreeNode *flatten_binary_tree_helper(TreeNode *root){ if(root == nullptr){ return root; } //Convert right subtree to list TreeNode *right_subtree = flatten_binary_tree_helper(root->right); //Convert left tree to list and concatenate it to the right of the tree root->right = flatten_binary_tree_helper(root->left); root->left = nullptr; TreeNode *tmp_root = root; //Concatenate right subtree while(tmp_root->right){ tmp_root = tmp_root->right; } tmp_root->right = right_subtree; return root; } /* * func: flatten_binary_tree * goal: flatten a binary tree to a linked list in place * @param root: root node of the tree * return: */ void flatten_binary_tree(TreeNode *root){ flatten_binary_tree_helper(root); }
Python Code:
# func: flatten binary tree to a list # @param root: root node of the tree # @return: def flatten_binary_tree(root): def flatten_binary_tree_helper(node): if not node: return node #Faltten right subtree first right_subtree = flatten_binary_tree_helper(node.right) #Faltten left subtree and concatenate it to the right side of the tree node.right = flatten_binary_tree_helper(node.left) node.left = None #Find the spot to concatenate remaining right subtree iter = node while iter.right: iter = iter.right iter.right = right_subtree return node flatten_binary_tree_helper(root)
Reference Link:
1. My Leetcode: Flatten Binary Tree to Linked List (Java): http://rleetcode.blogspot.com/2014/02/flatten-binary-tree-to-linked-list-java.html
No comments:
Post a Comment