五一放假,宅在机房。昨天想换换思维,于是到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);
}