100.相同的树
题目描述:
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
解题思路:
递归来解,处理树的问题,首先应该处理好当前节点为空的问题,看输入几个参数,如果都为空怎么办,如果有一个为空怎么办?
如果都不为空怎么办?又分成相等怎么办,不等怎么办想好每种情况怎么处理,递归写在最后。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p == nullptr && q == nullptr) return true;
else if(p == nullptr || q == nullptr) return false;
if(p->val != q->val) return false;
if(!isSameTree(p->left,q->left)) return false;
if(!isSameTree(p->right,q->right)) return false;
return true;
}
};
2.路径总和
题目描述:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
解题思路:DFS可以用栈去模拟递归就可以解决
不管是dfs,还是递归,在树的问题前面,一定先考虑为空的额情况!只有一个根节点的情况!在考虑将递归带入。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root == nullptr) return false;
if(root->val == sum && root->left == nullptr && root->right == nullptr) return true;
if(root->left != nullptr && hasPathSum(root->left,sum-root->val)) return true;
if(root->right != nullptr && hasPathSum(root->right,sum-root->val)) return true;
return false;
}
};
3.求根到叶子节点数字之和
题目描述:
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:
输入: [4,9,0,5,1]
4
/ \
9 0
/ \
5 1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.
dfs首先就考虑当前节点是根节点是叶节点的情况。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void dfs(TreeNode* root,int p,int& res){
if(root == nullptr) return ;
p = p*10+root->val;
if(root->left == nullptr&&root->right == nullptr){
res += p;
return ;
}
dfs(root->left,p,res);
dfs(root->right,p,res);
}
int sumNumbers(TreeNode* root) {
int res = 0;
dfs(root,0,res);
return res;
}
};
4.平衡二叉树
题目描述:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isBalanced(TreeNode* root) {
bool balance = false;
int h = 0;
return Balanced(root,h);
}
bool Balanced(TreeNode* root,int& h){
if(root==nullptr) {
h = 0;
return true;
}
if(root->left == nullptr&&root->right==nullptr){
h = 1;
return true;
}
int hl,hr;
bool bl = Balanced(root->left,hl);
bool br = Balanced(root->right,hr);
h = (hl>hr?hl:hr)+1;
if(abs(hl-hr)<2){
return bl&&br;
}
return false;
}
};