【数据结构】_二叉树基础OJ
目录
1. 单值二叉树
1.1 题目链接与描述
1.2 解题思路
1.3 程序
2. 相同的树
2.1 题目链接与描述
2.2 解题思路
2.3 程序
3. 对称二叉树
3.1 题目链接与描述
3.2 解题思路
3.3 程序
1. 单值二叉树
1.1 题目链接与描述
题目链接:
965. 单值二叉树 - 力扣(LeetCode)
题目描述:
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true
;否则返回 false
。
1.2 解题思路
思路1:遍历法,遍历二叉树进行值的对比,若全部值相同则返回true,否则返回false;
思路2:分治法:
如果二叉树为空,则返回true;
如果二叉树非空,则依次将当前根结点的值与左右孩子结点的值进行比较,不等则返回false;
1.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isUnivalTree(struct TreeNode* root) {if (root == NULL)return true;if (root->left && root->left->val != root->val)return false;if (root->right && root->right->val != root->val)return false;return isUnivalTree(root->left)&&isUnivalTree(root->right);
}
2. 相同的树
2.1 题目链接与描述
题目链接:
100. 相同的树 - 力扣(LeetCode)
题目描述:
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
2.2 解题思路
分治思想,两棵树的根与根相比,左子树与左子树比较,右子树与右子树比较,对于每一棵子树,仍然采用根、左子树、右子树的顺序进行比较。
2.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
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);
}
3. 对称二叉树
3.1 题目链接与描述
题目链接:
101. 对称二叉树 - 力扣(LeetCode)
题目描述:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
3.2 解题思路
除根结点外,从第二层子树开始,根与根比较,一个根结点的左子树与另一个根结点的右子树比较,一个根结点的右子树与另一个根结点的左子树比较。
与第二题思路类似,为了更方便实现两棵子树的对称比较,再封装一个函数isSubSymmic,将第二层的两个结点指针作为参数传递给该函数。
3.3 程序
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
bool isSubSymmetric(struct TreeNode* leftTreeNode,struct TreeNode* rightTreeNode){if (leftTreeNode == NULL && rightTreeNode == NULL)return true;if (leftTreeNode == NULL || rightTreeNode == NULL)return false;if (leftTreeNode->val != rightTreeNode->val)return false;return isSubSymmetric(leftTreeNode->left, rightTreeNode->right)&&isSubSymmetric(leftTreeNode->right, rightTreeNode->left);
}
bool isSymmetric(struct TreeNode* root) {if (root == NULL)return true;return isSubSymmetric(root->left,root->right);
}