题目描述:
将一棵二叉树按照前序遍历拆解成为一个假链表
。所谓的假链表是说,用二叉树的right 指针,来表示链表中的 next 指针。
注意事项
不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。
1
\
1 2
/ \ \
2 5 => 3
/ \ \ \
3 4 6 4
\
5
\
6
先对根节点进行判断,如果根节点为空,则返回空;若左子树和右子树同时为空,则返回空:若左子树为空,将右子树赋给右子树;若右子树为空,对左子树进行遍历,并对便利的结果进行保存,然后将左子树赋给右子树;若左子树和右子树都不为空,则遍历左子树和右子树,将左子树的值赋给右子树。
代码实现:
class Solution {
public:
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
void flatten(TreeNode *root) {
// write your code here
if(root==NULL)
return;
if(root->left==NULL&&root->right==NULL)
return;
if(root->left==NULL){
TreeNode *right=root->right;
flatten(right);
return;
}
if(root->right==NULL){
TreeNode *left=root->left;
root->right=left;
flatten(left);
root->left=NULL;
return;
}
TreeNode *left = root->left;
TreeNode *right = root->right;
root->right = left;
flatten(left);
TreeNode *p = left;
while(p->right!=NULL){
p = p->right;
}
p->right = right;
flatten(right);
root->left = NULL;
return;
}
};
感想:
将二叉树拆成链表,即将右子树变成左子树的子树。