将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
注意事项:
不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
样例:
1
\
1 2
/ \ \
2 5 => 3
/ \ \ \
3 4 6 4
\
5
\
6
挑战 :
不使用额外的空间耗费。
思路:
递归,先处理节点的右边build(root->right),再处理节点左边build(root->left),
若build(root->left)不为空,root->right=build(root->left);再找到build(root->left)的叶子节点p,
p->right=build(root->right)。
#ifndef C453_H
#define C453_H
#include<iostream>
using namespace std;
class TreeNode{
public:
int val;
TreeNode *left, *right;
TreeNode(int val)
{
this->val = val;
this->left = this->right = NULL;
}
};
class Solution {
public:
/*
* @param root: a TreeNode, the root of the binary tree
* @return:
*/
void flatten(TreeNode * root) {
// write your code here
if (root == NULL)
return;
root = build(root);
}
TreeNode *build(TreeNode *root)
{
if (root == NULL)
return NULL;
TreeNode *p = build(root->right);
if (build(root->left) != NULL)
{
root->right = build(root->left);
TreeNode *q = build(root->left);
while (q->right != NULL)
q = q->right;
q->right = p;
}
else
root->right = p;
root->left = NULL;
return root;
}
};
#endif