【算法】二叉树系列1-力扣两题(1022,剑指offer 26)

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

二叉树系列

1.1022 从根到叶的二进制数之和

题目:

给出一棵二叉树,其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。

例如,如果路径为 0 -> 1 -> 1 -> 0 -> 1,那么它表示二进制数 01101,也就是 13 。 对树上的每一片叶子,我们都要找出从根到该叶子的路径所表示的数字。

返回这些数字之和。题目数据保证答案是一个 32 位 整数。

image-20220530220819834

输入: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相同的结构和节点值。

WeChat2bb023108ded2629bd2e6d913280148e.png

示例 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);
             
     }