思路:
显然层序/广度优先遍历更适合此题,
在层序遍历的过程中,连接每一层上的各个结点即可。
class Solution {
public:
Node* connect(Node* root) {
queue<Node*>q;
if(root==NULL)return root;
q.push(root);
while(!q.empty())
{
int size=q.size();
Node*newNode=NULL;//每一层之前都先创建一个NULL指针,用来指向这一层的第一个结点
for(int i=1;i<=size;i++)
{
Node*tmp=q.front();
q.pop();
if(tmp->left)q.push(tmp->left);
if(tmp->right)q.push(tmp->right);
if(i!=1)
newNode->next=tmp;//当该指针不是该层第一个元素时,移动newNode,连接两个结点
newNode=tmp;
}
}
return root;
}
};
思路:内外层双重检查
外层检查:root的每一个子树是否可能和subroot相同;
内层检查:检查所有可能的子树中的每一个结点是否和subroot结点相同;
难度:较难,哪里是简单题。。。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//内层检查函数,查看结点是否相等
bool compare(TreeNode* root, TreeNode* subRoot) {
//如果两个都为空
if(root==NULL&&subRoot==NULL){
return true;
}
//如果只有一个为空
if(root==NULL||subRoot==NULL){
return false;
}
//如果两个都不空,结点值也不同,那直接返回false
if(root->val!=subRoot->val){
return false;
}
//如果现在结点值和子树结点值相同,再分别检查两个的左右孩子
return compare(root->left, subRoot->left) && compare(root->right, subRoot->right);
}
//外层检查函数,查看是否是子树
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
//如果要检查的子树为空,那么不用查了,肯定对的
if(subRoot == NULL) return true;
//如果要检查的子树不空,但root是空的,那也不用查了,错的。
if(root == NULL) return false;
//要么是它本身,要么是它左子树,要么是它的右子树
return compare(root, subRoot) || isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
};