1. 二叉树的前序遍历
2.对称二叉树
3. 翻转二叉树
1.二叉树的前序遍历
https://leetcode.cn/problems/binary-tree-preorder-traversal/
给你二叉树的根节点 root
,返回它节点值的 前序 遍历。
int* preorderTraversal(struct TreeNode* root, int* returnSize){
}
这道题跟前序遍历的区别不大,主要区别要将前序遍历的结点值存储到动态开辟的数组中,并将数组中元素个数保存到returnSize中。我们计算这个二叉树的结点个数,并malloc一个同大的数组。
其次,主函数不太利于遍历,我们可以创建一个子函数进行遍历,并将结点值存储到动态数组同即可。
计算节点个数:
int TreeSize(struct TreeNode* root)
{
return root==NULL? 0:TreeSize(root->left)+TreeSize(root->right)+1;
}
子函数递归:
//先保存根节点数据,再遍历左右子树
void _preorder(struct TreeNode* root,int* arr,int* pi)
{
if(root==NULL)
{
return;
}
arr[*pi]=root->val;
(*pi)++;
_preorder(root->left,arr,pi);
_preorder(root->right,arr,pi);
}
下面是整体代码:
int TreeSize(struct TreeNode* root)
{
return root==NULL? 0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void _preorder(struct TreeNode* root,int* arr,int* pi)
{
if(root==NULL)
{
return;
}
arr[*pi]=root->val;
(*pi)++;
_preorder(root->left,arr,pi);
_preorder(root->right,arr,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int size=TreeSize(root);
*returnSize=size;
int* arr=(int*)malloc(sizeof(int)*size);
int i=0;
_preorder(root,arr,&i);
return arr;
}
2.对称二叉树
https://leetcode.cn/problems/symmetric-tree/
给你一个二叉树的根节点 root
, 检查它是否轴对称。
思路:
判断一个二叉树是否为对称二叉树,我们从根节点的左右子树分成二棵树,判断两颗树的左子树是否跟另一棵树的右子树相同,右子树是否跟另一颗树的左子树相同。再递归左右子树。
bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2)
{
//两棵树同时为空
if(root1==NULL&&root2==NULL)
{
return true;
}
//判断 一棵树而空而另一棵树不为空 返回false
if(root1==NULL||root2==NULL)
{
return false;
}
if(root1->val!=root2->val)
{
return false;
}
return _isSymmetric(root1->left,root2->right)&&_isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root){
return _isSymmetric(root->left,root->right);
}
3.翻转二叉树
https://leetcode.cn/problems/invert-binary-tree/
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
思路:我们递归到最后一层,向上返回,将每个节点的左右子树进行交换,最后再将根节点的左右交换即可。
struct TreeNode* invertTree(struct TreeNode* root){
if(root==NULL)
{
return NULL;
}
struct TreeNode* left=invertTree(root->left);
struct TreeNode* right=invertTree(root->right);
root->left=right;
root->right=left;
return root;
}