当前位置:   article > 正文

【LeetCode】二叉树oj专题

【LeetCode】二叉树oj专题

如有不懂的地方,可查阅往期相关文章!

                    个人主页小八哥向前冲~

                    所属专栏数据结构【c语言】


目录

单值二叉树

对称二叉树

计算二叉树的深度

二叉树的前序遍历

相同二叉树

另一棵树的子树

二叉树的构建和遍历

翻转二叉树

判断平衡二叉树


单值二叉树

题目

详情单值二叉树_LeetCode

思路

运用递归,每次递归将根,左孩子,右孩子进行比较!

而最后一次就是左子树,右子树和根的比较!

代码

  1. bool isUnivalTree(struct TreeNode* root) {
  2. //递归
  3. //每次递归看成根,左孩子,右孩子比较
  4. //最后一次递归是左子树和右子树和根比较
  5. if(root==NULL)
  6. return true;
  7. //左子孩子存在就开始比较
  8. if(root->left&&root->val!=root->left->val)
  9. return false;
  10. //右孩子存在就开始比较
  11. if(root->right&&root->val!=root->right->val)
  12. return false;
  13. return isUnivalTree(root->left)&&isUnivalTree(root->right);
  14. }

对称二叉树

题目

详情判断对称二叉树_LeetCode

思路

运用递归,将左子树和右子树进行比较!

所以需要分装一个函数比较左子树和右子树。

这个函数里面的左子树的左孩子要和右子树的右孩子比较,左子树的右孩子要和右子树的左孩子比较!

代码

  1. bool _checkSymmetricTree(struct TreeNode*q,struct TreeNode*p)
  2. {
  3. //递归
  4. //最后一次递归是q的左子树和p的右子树判断,q的右子树和p的左子树判断
  5. //每次递归看作q的根和p的根判断,q的孩子和p的孩子判断是否相等
  6. if(q==NULL&&p==NULL)
  7. return true;
  8. //如果俩根只有一个为空就是假
  9. if(q==NULL||p==NULL)
  10. return false;
  11. if(q->val!=p->val)
  12. return false;
  13. return _checkSymmetricTree(q->left,p->right)&&
  14. _checkSymmetricTree(q->right,p->left);
  15. }
  16. bool checkSymmetricTree(struct TreeNode* root) {
  17. //递归
  18. //最后一次递归是左子树和右子树是否相等
  19. if(root==NULL)
  20. return true;
  21. return _checkSymmetricTree(root->left,root->right);
  22. }

计算二叉树的深度

题目

详情计算二叉树深度_LeetCode

思路

我们不难看出:树的高度==高的子树的高度+1。

代码

  1. int calculateDepth(struct TreeNode* root) {
  2. //左子树和右子树比较,大的子树加+1就是高度
  3. if(root==NULL)
  4. return 0;
  5. int leftheight=calculateDepth(root->left);
  6. int rightheight=calculateDepth(root->right);
  7. return leftheight>rightheight?leftheight+1:rightheight+1;
  8. }

二叉树的前序遍历

题目

前序遍历二叉树,将值存到数组中。

详情二叉树的前序遍历_LeetCode

思路

为了开辟的数组不大不小,我们计算树节点总数,然后进行前序遍历一个一个将树节点数值写入数组中。

以此则中序遍历和后序遍历也是如此!

代码

  1. int TreeSize(struct TreeNode*root)
  2. {
  3. //左子树节点+右子树节点+1
  4. return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
  5. }
  6. void preorder(struct TreeNode*root,int*a,int*i)
  7. {
  8. if(root==NULL)
  9. return;
  10. a[(*i)++]=root->val;
  11. preorder(root->left,a,i);
  12. preorder(root->right,a,i);
  13. }
  14. int* preorderTraversal(struct TreeNode* root, int* returnSize) {
  15. //为了开辟的数组不大不小,我们先计算树的节点总数
  16. *returnSize=TreeSize(root);
  17. int*a=(int*)malloc(sizeof(int)*(*returnSize));
  18. int i=0;
  19. preorder(root,a,&i);
  20. return a;
  21. }

相同二叉树

题目

详情相同的树_LeetCode

思路

运用递归,分别将俩棵树的根和根比较,左子树和左子树比较,右子树和右子树比较!

代码

  1. bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
  2. //p的左子树和q的左子树比较,p的右子树和q的右子树比较
  3. if(p==NULL&&q==NULL)
  4. return true;
  5. if(p==NULL||q==NULL)
  6. return false;
  7. if(p->val!=q->val)
  8. return false;
  9. return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
  10. }

另一棵树的子树

题目

详情另一颗子树_LeetCode

思路

将树的所有子树和另一棵树进行比较,如果相同就真,否则,假!

将问题转化成俩棵树是否相同的比较!

代码:

  1. bool SameTree(struct TreeNode*q,struct TreeNode*p)
  2. {
  3. if(q==NULL&&p==NULL)
  4. return true;
  5. if(q==NULL||p==NULL)
  6. return false;
  7. if(q->val!=p->val)
  8. return false;
  9. return SameTree(q->left,p->left)&&SameTree(q->right,p->right);
  10. }
  11. bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
  12. //找出所有子树,再和另一棵子树比较是否相同
  13. if(root==NULL)
  14. return false;
  15. //值相等时,开始比较树是否相等
  16. if(root->val==subRoot->val&&SameTree(root,subRoot))
  17. return true;
  18. //在左子树和右子树中能找到就行
  19. return isSubtree(root->left,subRoot)
  20. ||isSubtree(root->right,subRoot);
  21. }

二叉树的构建和遍历

题目

详情二叉树的构建和遍历_牛客网

思路

遍历读取数组的每个值,前序遍历将树建好,最后中序遍历二叉树打印!

代码

  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. typedef struct TreeNode {
  4. struct TreeNode* left;
  5. struct TreeNode* right;
  6. char val;
  7. } TNode;
  8. void Inoder(TNode*root)
  9. {
  10. if(root==NULL)
  11. return;
  12. Inoder(root->left);
  13. printf("%c ",root->val);
  14. Inoder(root->right);
  15. }
  16. TNode*CreateTree(char*a,int*i)
  17. {
  18. if(a[(*i)]=='#')
  19. {
  20. (*i)++;
  21. return NULL;
  22. }
  23. TNode*node=(TNode*)malloc(sizeof(TNode));
  24. node->val=a[(*i)++];
  25. node->left=CreateTree(a, i);
  26. node->right=CreateTree(a, i);
  27. return node;
  28. }
  29. int main() {
  30. char a[100];
  31. scanf("%s",a);
  32. int i=0;
  33. TNode*root=CreateTree(a,&i);
  34. Inoder(root);
  35. return 0;
  36. }

翻转二叉树

题目

详情翻转二叉树_LeetCode

思路

递归,先将左子树交换,再将右子树交换!

代码

  1. struct TreeNode* invertTree(struct TreeNode* root) {
  2. if(root==NULL)
  3. return NULL;
  4. struct TreeNode*tmp;
  5. tmp=root->left;
  6. root->left=root->right;
  7. root->right=tmp;
  8. //交换左子树
  9. if(root->left)
  10. invertTree(root->left);
  11. //交换右子树
  12. if(root->right)
  13. invertTree(root->right);
  14. return root;
  15. }

判断平衡二叉树

题目

详情平衡二叉树_LeetCode

代码:

  1. int TreeHeight(struct TreeNode* p) {
  2. if (p == NULL)
  3. return 0;
  4. int leftheight = TreeHeight(p->left);
  5. int rightheight = TreeHeight(p->right);
  6. return leftheight > rightheight ? leftheight + 1 : rightheight + 1;
  7. }
  8. bool isBalanced(struct TreeNode* root) {
  9. if (root == NULL)
  10. return true;
  11. return isBalanced(root->left) && isBalanced(root->right)&&
  12. abs(TreeHeight(root->left) - TreeHeight(root->right)) <= 1;
  13. }

今天的题目,你都学会了吗?我们下期见!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/690478
推荐阅读
相关标签
  

闽ICP备14008679号