Flatten Binary Tree to Linked List(leetcode)

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的下一节点即可。

或者使用一个栈存储每一分支点,最后迭代得出完整链表。

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();
            }
        }
    }
};
但是需要的是list in-place,则最好使用递归求解。

方法是对每个节点,调换左右子节点顺序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 );
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值