一道简单的题目:将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。
就用这个来作为我的第一篇博客吧。因为这里我开始写的是递归的写法,然后想迭代的方法的时候,瞄了一眼答案,就写出来这东西。平时都偷懒写递归,以后要多写迭代了,这代码很简单,就不解释了,反正这个也没人看,就我自己的记录而已。这一篇就这样吧。
class Solution {
public:
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
*/
void flatten(TreeNode *root) {
// write your code here
if(NULL == root)
return;
//迭代方法:
//因为观察得知,这个的规律是当前的root的右孩子放在他左孩子的
//最右节点的后面。root的右孩子按照题意肯定是他的左孩子。
//所以可以就这这规律写出这代码。
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;
}
}
//递归函数。使用时候直接调用即可。
//分析状态即可,当前root的右孩子是排好序的左孩子。
//左孩子的右孩子是排好序的右孩子的head。注意检测下NULL就行
TreeNode *change(TreeNode *root){
if(NULL == root)
return NULL;
TreeNode * head,*left,*right;
head = root;
left = head->left;
right = head -> right;
head->left=NULL;
left=change(left);
right = change(right);
head->right=left;
if(left!=NULL){
while(left->right!=NULL)
left = left->right;
left->right = right;
}
else{
head->right = right;
}
return head;
}
};