1.比较对称二叉树(镜像二叉树)
二叉树相关题1中第二题的变形题。先去看1哦!
左子树和右子树比较
bool _isSymmetric(struct TreeNode* p, struct TreeNode* q)
{
if (p == NULL && q == NULL)
return true;
//如果两个都为空则是相等的
if (p == NULL || q == NULL)
return false;//若一个为空,一个不为空
if (p->val != q->val)//值不同
{
return false;
}
return isSameTree(p->left, q->right) && isSameTree(p->right, q->left);
}//反复递归
bool isSymmetric(struct TreeNode* root)
{
return _isSymmetric(root->left, root->right);
}
2.二叉树的前序遍历
注意:返回的数组必须要开辟动态空间,并且,假定了访问的人会free,所以只用管mallooc就行了。
//用前序遍历二叉树
//力扣规定如果返回数组,需要返回数组大小,就必须要知道这个数组的大小是多少(oj)
//先遍历一遍这个树,看是多少size
int TreeSize(struct TreeNode*root)
{
return root == NULL ? 0 : TreeSize( root->left) + TreeSize(root->right) + 1;
}
//开辟空间
//returnSize输出型参数
// 传过去的是地址
// 下面解引用就可以改变里面的内容
// 就拿到了数组的大小是用来输出的
//形参//都用指针接受,这样可以进行更改
void preOrder(struct TreeNode* root, int* a, int* pi)
{
if (root == NULL)
return;
a[(*pi)++] = root->val;
preOrder(root->left, a, pi);
preOrder(root->right, a, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
//解引用
*returnSize = TreeSize(root);//得到root的大小
int* a = (int*)malloc(sizeof(int) * (*returnSize));
int i = 0;
preOrder(root, a, &i);
return a;//传的是数组
}