114. 二叉树展开为链表(通过)
思路:递归
效率:5.90%
程序代码:
错误程序,为什么我让一个原本指向空的指针指向别的树,结果会差别这么大
class Solution {
public:
TreeNode* tmp;
void flatten(TreeNode* root) {
if (root == NULL) return;
flatten(root->left);
flatten(root->right);
tmp = root;//临时指示的指针
while (tmp->right != NULL) tmp = tmp->right;
tmp->right = root->left;
root->left = NULL;
}
};
VS
class Solution {
public:
TreeNode* tmp;
void flatten(TreeNode* root) {
if (root == NULL) return;
flatten(root->left);
flatten(root->right);
tmp = root;//临时指示的指针
while (tmp != NULL) tmp = tmp->right;
tmp = root->left;
root->left = NULL;
}
};
经过一番麻烦的指针,卧槽终于搞出来了。
程序代码(通过)
class Solution {
public:
TreeNode* tmp;
void flatten(TreeNode* root) {
if (root == NULL) return;
flatten(root->left);
flatten(root->right);
tmp = root->left;//临时指示的指针
if(tmp!=NULL){
while (tmp->right!= NULL) tmp = tmp->right;
tmp->right= root->right;
root->right=NULL;
root->right = root->left;
root->left = NULL;
}
}
};
116. 填充同一层的兄弟节点(通过)
思路:递归
卧槽,一次性通过,真棒,其实关于这道题,我还是想了有一会儿的。
效率:52.06%,还凑合
程序代码:
class Solution {
public:
TreeLinkNode* a;//创建两个指针
TreeLinkNode* b;//创建两个指针
TreeLinkNode* tmp;//创建两个指针
void connect(TreeLinkNode *root) {
if (root == NULL) return;
connect(root->left);
connect(root->right);
a = root->left;
b = root->right;
while (a != NULL) {
a->next= b;
a = a->right;
b = b->left;
}
tmp = root;
while (tmp != NULL) {
tmp->next = NULL;
tmp = tmp->right;
}
}
};
关于某些错误的知识点补充,见第一道程序
不能直接使用tmp=NULL时对tmp进行赋值,因为此时tmp只是内存中的一个普通的指针已经和原来的结构脱离了关系。