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
题目内容即为将一棵二叉树改换为前序遍历的链表形式(next即为right指针)
如果允许使用额外内存则很简单,如直接前序遍历树,对每个节点依次连上其pre-order的下一节点即可。
或者使用一个栈存储每一分支点,最后迭代得出完整链表。
但是需要的是list in-place,则最好使用递归求解。class Solution { public: void flatten(TreeNode *root) { if( root == NULL || root -> right == NULL && root -> left == NULL ) return ; stack<TreeNode*> stk; stk.push(root); while( !stk.empty() ) { TreeNode *temp = stk.top(); if( temp -> right != NULL) stk.push( temp -> right ); if( temp -> left != NULL ) { temp -> right = temp -> left; temp -> left = NULL; stk.push( temp -> right ); } if( temp -> left == NULL && temp -> right == NULL ) { stk.pop(); temp -> left = stk.top(); } } } };
方法是对每个节点,调换左右子节点顺序revolve,直至整个二叉树revolve完。
然后对其使用一个build函数将所有左分支链接到右分支的末端节点上,直至左分支数为0;
class Solution { public: void revolve( TreeNode *node ) { if( node -> left == NULL && node -> right == NULL ) return; else if( node -> left == NULL ) revolve( node -> right ); else { TreeNode *temp = node -> left; node -> left = node -> right; node -> right = temp; revolve( node -> right ); if( node -> left != NULL ) revolve( node -> left ); } } void build( TreeNode *root ) { int flag = 1; TreeNode *p = root,*temp = NULL; while( p -> right != NULL ) { if( p -> left != NULL ) { temp = p; flag = 0; } p = p -> right; } if( flag ) return; p -> right = temp -> left; temp -> left = NULL; return build( root ); } void flatten(TreeNode *root) { if( root == NULL || root -> right == NULL && root -> left == NULL ) return ; revolve( root ); build( root ); } };