Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / 2 5 /\ 3 4 6
The flattened tree should look like:
1 2 3 4 5 6
Using the method of pre-order traversal to realize
voidFlatten (treenode*root) { if(Root = =nullptr)return; Stack<TreeNode*>STA; Sta.push (root); TreeNode* Lastroot =Root; while(!Sta.empty ()) {Root=Sta.top (); if(Lastroot! = root->Right ) { if(Lastroot! = root->Left ) { if(Root->left! =nullptr) {Sta.push (Root-Left ); Continue; } } Else{TreeNode* Tempnode = root->Right ; Root->right =Lastroot; Root->left =nullptr; TreeNode* Endnode =Lastroot; while(Endnode->right! =nullptr) Endnode= endnode->Right ; Endnode->right =Tempnode; } if(Root->right! =nullptr) {Sta.push (Root-Right ); Continue; }} lastroot=Root; Sta.pop (); }}
Methods that do not use traversal, that is, do not use a stack solution
voidFlatten (TreeNode *root) {TreeNode*now =Root; while(now) {if(now->Left ) { //Find Current node ' s prenode. Links to current node's right subtreetreenode* pre = now->Left ; while(pre->Right ) {Pre= pre->Right ; } Pre->right = now->Right ; //Use the current node's left subtree to replace its right subtree (original right//subtree is already linked by current node ' s PrenodeNow->right = now->Left ; now->left =NULL; } Now= now->Right ; }}
Flatten Binary Tree to Linked List