[LeetCode-30]Flatten Binary Tree to Linked List

本文详细介绍了如何通过递归方法将二叉树转换为链表,确保操作在原地完成,同时保持了节点间的前序遍历顺序。提供多种实现方式,包括C++、Java等语言实例,帮助读者理解并掌握这一技巧。

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

click to show hints.

Hints:

If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

Analysis:

Note that the problem requires in-place operation.The flatten procedure is like: cut the left child and set to right, the right child is then linked to somewhere behind the left child. Where should it be then? Actually the right child should be linked to the most-right node of the left node. So the algorithm is as follows:
(1) store the right child (we call R)
(2) find the right-most node of left child
(3) set R as the right-most node's right child.
(4) set left child as the right child
(5) set the left child NULL
(6) set current node to current node's right child.
(7) iterate these steps until all node are flattened.

This seems simple and elegent.

c++

void flatten(TreeNode *root) {
        if(root == NULL) return;
    while(root){
        if(root->left){
            TreeNode *pre = root->left;
            while(pre->right)
                pre = pre->right;
            pre->right = root->right;
            root->right = root->left;
            root->left = NULL;
        }
        root = root->right;
    }
    }


java

public void flatten(TreeNode root){
		while(root!=null){
			if(root.left!=null){
				TreeNode pre = root.left;
				while(pre.right!=null)
					pre = pre.right;
				pre.right = root.right;
				root.right = root.left;
				root.left = null;
			}
			root = root.right;
		}
	}


other solutions:

java

public void flatten(TreeNode root) {
        if(root == null) return;
        flattenSubtree(root);
    }
	public TreeNode flattenSubtree(TreeNode root){
		if(root == null) return null;
		else if(root.left == null && root.right == null) return root;
		else {
			TreeNode left = root.left;
			TreeNode right = root.right;
			root.left = null;
			if(left!=null){
				root.right = left;
				TreeNode temp = flattenSubtree(left);
				temp.left = null;
				if(right!=null){
					temp.right = right;
				}else {
					return temp;
				}
			}
			return flattenSubtree(right);
		}
	}

c++

TreeNode *flatTree(TreeNode *root)
{
    if(root == NULL)
        return NULL;
    else if(root->left == NULL && root->right==NULL)
        return root;
    else{
        TreeNode *left = root->left;
        TreeNode *right = root->right;
        root->left = NULL;
        if(left != NULL){
            root->right = left;
            TreeNode *temp = flatTree(left);
            temp->left = NULL;
            if(right == NULL)
                return temp;
            else
                temp->right = right;
        }
        return flatTree(right);
    }
}
    void flatten(TreeNode *root) {
        if(root == NULL)
        return;
    flatTree(root);
    }


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值