Oj小记:关于二叉树题一二

二叉树遍历

前序遍历:

题目描述

实例:

解题思路:

这道要我们返回这棵二叉树的前序遍历的结果,我们可以用一个数组将它的返回结果保存下来,题目也要求我们返回的是一个数组,以就构建一个数组,大小就为二叉树结点个数

那我们就需要先求二叉树的结点数

然后构建二叉树结点个数大小的数组

然后用前序遍历将二叉树的值传入数组中

最后返回数组就可以了

代码如下:

cpp 复制代码
typedef struct TreeNode TreeNode;
// 二叉树结点个数
 int TreeSize(TreeNode* root)
 {
    if(root==NULL)
    {
        return 0;
    }
    return 1+TreeSize(root->left)+TreeSize(root->right);
 }
//前序遍历
void preorder(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) {
    *returnSize=TreeSize(root);//求二叉树中结点个数
    int i=0;
    int* arr=(int*)malloc(sizeof(int)*(*returnSize));//开二叉树节点个数的空间给数组
    preorder(root,arr,&i);//前序遍历将二叉树结点值插入数组中
    return arr;//返回数组
}

中序遍历:94. 二叉树的中序遍历 - 力扣(LeetCode)

这道题的解题思路和前序遍历差不多

代码如下:

cpp 复制代码
typedef struct TreeNode TreeNode;
 int TreeSize(TreeNode* root)
 {
    if(root==NULL)
    {
        return 0;
    }
    return 1+TreeSize(root->left)+TreeSize(root->right);
 }

void InOrder(TreeNode* root,int* arr,int* pi)
{
    if(root==NULL)
    {
        return;
    }
    InOrder(root->left,arr,pi);
    arr[*pi]=root->val;
    (*pi)++;
    InOrder(root->right,arr,pi);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=TreeSize(root);
    int* arr=(int*)malloc(sizeof(int)*(*returnSize));
    int i=0;
    InOrder(root,arr,&i);
    return arr;
}

后序遍历:145. 二叉树的后序遍历 - 力扣(LeetCode)

解题思路和前两道题差不多,就不多赘述

代码为:

cpp 复制代码
typedef struct TreeNode TreeNode;
 int TreeSize(TreeNode* root)
 {
    if(root==NULL)
    {
        return 0;
    }
    return 1+TreeSize(root->left)+TreeSize(root->right);
 }
 void PostOrder(TreeNode* root,int* arr,int* pi)
 {
    if(root==NULL)
    {
        return; 
    }
    PostOrder(root->left,arr,pi);
    PostOrder(root->right,arr,pi);
    arr[*pi]=root->val;
    (*pi)++;
 }
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=TreeSize(root);
    int* arr=(int*)malloc(sizeof(int)*(*returnSize));
    int i=0;
    PostOrder(root,arr,&i);
    return arr;
}

单值二叉树:965. 单值二叉树 - 力扣(LeetCode)

解题思路:

这道题就是要比较每个结点的值,其实就分为根结点和左孩子结点的比较、根结点和右孩子结点的比较,比完这两步就不需要再比较左孩子结点和右孩子结点

要注意的是:当结点为空要返回空

代码为:

cpp 复制代码
//根结点 : 左孩子结点
//根结点 : 右孩子结点
bool isUnivalTree(struct TreeNode* root) {
    if(root==NULL)
    {
        return true;
    }
    if(root->left&&root->val!=root->left->val)
    {
        return false;
    }
    if(root->right&&root->val!=root->right->val)
    {
        return false;
    }
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

相同的树:100. 相同的树 - 力扣(LeetCode)

解题思路:

这道题要考虑的情况比较多:
当两个树的结点都为空,就返回真;

当其中有一棵树的结点不为空,就返回假;

当它们的结点的值相等就返回真。

遍历的步骤为:先分别遍历两棵树的左子树结点,再遍历右子树结点,只有两棵树的结点都相等的情况下,才表示两棵树相同

代码为:

cpp 复制代码
 /*
    先遍历左子树,再遍历右子树
    要保证两棵子树的值都相等
    才能返回真
 */
bool isSameTree(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->left)&&isSameTree(p->right,q->right);
}

另一棵树的子树572. 另一棵树的子树 - 力扣(LeetCode)

解题思路:

这道题要用到前一题的思路,又因为这道题是求是否为另一棵树的子树,所以还要多考虑几种情况:

当其中一颗树为空就返回假;

两棵树的比较,只要左右子树其中一棵和另外一棵树相同就为真

代码为:

cpp 复制代码
typedef struct TreeNode TreeNode;
 bool isSameTree(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->left)&&isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if(root==NULL)
    {
        return false;
    }
    if(isSameTree(root,subRoot))
    {
        return true;
    }
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

对称二叉树101. 对称二叉树 - 力扣(LeetCode)

解题思路

这道题和相同的树这道题的解题思路没什么区别,就需要注意的是:它的对比的是左子树的左孩子和右子树的右孩子

代码为:

cpp 复制代码
bool isSameTree(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) {
    if(isSameTree(root->left,root->right))
    {
        return true;
    }
    return false;
}
相关推荐
上弦月-编程1 小时前
高效编程利器:转移表技术解析
c语言·开发语言·数据结构·算法·排序算法
薇茗1 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树2
c语言·数据结构·算法·二叉树
Wyc724093 小时前
数据结构1
数据结构
lcj25113 小时前
【数据结构精讲】堆与二叉树从底层原理到代码落地:堆的构建 / 调整 / 排序 + 二叉树遍历 / 操作(附完整 C++ 源码 + LeetCode 题解)
数据结构·c++·leetcode
努力努力再努力wz3 小时前
【MySQL 进阶系列】C/C++ 如何通过客户端库访问 MySQL?从连接原理到 API 调用流程详解(附完整demo代码)
服务器·c语言·数据结构·数据库·c++·b树·mysql
xuhaoyu_cpp_java3 小时前
单调栈(算法)
java·数据结构·经验分享·笔记·学习·算法
诙_3 小时前
C++数据结构--排序算法
数据结构·算法·排序算法
许彰午4 小时前
02-手写链表、栈、队列——不依赖任何集合框架
数据结构·链表·面试
MegaDataFlowers4 小时前
141.环形链表
数据结构·链表
JAVA面经实录91713 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法