持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
二叉树系列
1.1022 从根到叶的二进制数之和
题目:
给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。 对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。
返回这些数字之和。题目数据保证答案是一个 32 位 整数。
输入:root = [1,0,1,0,1,0,1] 输出:22 解释:(100) + (101) + (110) + (111) = 4 + 5 + 6 + 7 = 22 示例 2:
输入:root = [0] 输出:0
1.思路:
首选前序遍历,但是要放一个参数来目前的数值pre
dfs(node.left,pre);
dfs(node.right,pre);
第二步:从根节点到叶子结点,如果是叶子结点,就计算一个条路径的值(sum)
其次是求二进制,pre = pre*2 + 节点值
特殊的是root=[0]时,返回0
2.整体代码
class Solution {
int sum =0;
public int sumRootToLeaf(TreeNode root) {
dfs(root,0);
return sum;
}
private void dfs(TreeNode node ,int pre){
if(node == null) return;
if(node.right==null && node.left==null){
sum = sum + pre*2+node.val;
}
if(node.left !=null || node.right !=null)
pre = pre*2+node.val;
dfs(node.left,pre);
dfs(node.right,pre);
}
}
2.剑指Offer 26 树的子结构
题目:
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1] 输出:false 示例 2:
输入:A = [3,4,5,1,2], B = [4,1] 输出:true
思路:
1.两个树结构,分三种情况
a.B的根节点A的根结点相同
b.B的根结点在A的左子树中
c.B的根结点在A的右子树中
先分析第一种a,A树的节点值要与B树的节点值相同
public boolean isSubStructure(TreeNode A, TreeNode B) {
return dfs(A,B);
}
private boolean dfs(TreeNode A, TreeNode B){
if(A.val != B.val)
return false;
return dfs(A.left,B.left) && dfs(A.right,B.right);
}
特殊情况:
A、B有一个为空,直接返回false
A不能为空,A是被对比的,B可以为空
2.整体代码
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null) return false;
//上述三种情况,有一种满足就返回true
return dfs(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B);
}
private boolean dfs(TreeNode A, TreeNode B){
if(B == null)
return true;
if(A == null || A.val != B.val)
return false;
return dfs(A.left,B.left) && dfs(A.right,B.right);
}