LeetCode: Flatten Binary Tree to Linked List

来源:互联网 发布:工商银行纸黄金软件 编辑:程序博客网 时间:2024/06/03 13:56

五一放假,宅在机房。昨天想换换思维,于是到LeetCode上随便找了一题:《Flatten Binary Tree to Linked List》。很久没做过Binary Tree的题目了,有点陌生,耗时比较久。

原题如下:

Given a binary tree, flatten it to a linked list in-place.

For example,

Given
这里写图片描述

The flattened tree should look like:

这里写图片描述

我想了挺久,没什么头绪。一开始都没搞清这个是怎么个Flatten的,我参考了一下别人的code。我的code如下:

class Solution{public:    void flatten(TreeNode* root){        if(root == NULL) //判断根节点是否为空,若为空,直接return            return;        //此处定义两个TreeNode,作为遍历的指针        TreeNode *cur = root;//将根节点赋予当前节点,马上作为遍历的开始        TreeNode *last ==NULL;        while(cur != NULL)//判断当前父节点是否为空        {            if(cur->left != NULL)            {                last = cur->right;                while(last != NULL)                    last = last->right;//这句话的意思是遍历到左子树的最右边的叶子节点                //当遍历到左子树的最右边的一个节点时,将整个左子树移接到右子树上                last->right = cur->right;                cur->right = cur->left;                // 别忘了要将左子树置为NULL                cur->left = NULL;            }            //将“根节点“移向右节点,作为下一个“根节点“,重新遍历左子树,将左子树的最右边的叶子节点连接到当前“根节点“的右节点            cur = cur->right;        }    }}

画一张图,就很明白上面要做的事情了,注意我画的图中箭头的指向:
这里写图片描述

这种方法通俗简单,但runtime比较长,LeetCode上显示我的runtime拍的很后很后=_=…如下
这里写图片描述

我Google了一下,在这篇博客上还看到一种递归的方法。我依稀记得处理Binary Tree的问题,递归是一种很重要的方法。于是把这个方法也看了一下:

public void flatten(TreeNode root) {    ArrayList<TreeNode> pre = new ArrayList<TreeNode>();    pre.add(null);    helper(root, pre);}private void helper(TreeNode root, ArrayList<TreeNode> pre){    if(root == null)        return;    TreeNode right = root.right;    if(pre.get(0)!=null)    {        pre.get(0).left = null;        pre.get(0).right = root;    }    pre.set(0,root);    helper(root.left, pre);    helper(right, pre);}
0 0
原创粉丝点击