博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Leetcode】100. 相同的树
阅读量:5977 次
发布时间:2019-06-20

本文共 3295 字,大约阅读时间需要 10 分钟。

作者: 码蹄疾 毕业于哈尔滨工业大学。 小米广告第三代广告引擎的设计者、开发者; 负责小米应用商店、日历、开屏广告业务线研发; 主导小米广告引擎多个模块重构; 关注推荐、搜索、广告领域相关知识;

题目

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 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. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public boolean isSameTree(TreeNode p, TreeNode q) {        if (p == null && q == null) {            return true;        } else if (p == null || q == null) {            return false;        }                if (p.val == q.val) {            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);        } else {            return false;        }    }}复制代码

那如果用非递归解怎么解呢? 如果遇到二叉树的问题,没思路还有第二招,就是想想看是不是遍历的变种

  • 先序遍历
  • 中序遍历
  • 后序遍历
  • 层次遍历

我们可以用队列,一起进行层序遍历,同时比较左右两颗树:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public boolean isSameTree(TreeNode p, TreeNode q) {        if (p == null && q == null) {            return true;        } else if (p == null || q == null) {            return false;        }        LinkedList
queue = new LinkedList<>(); queue.add(p); queue.add(q); while(!queue.isEmpty()) { TreeNode left = queue.poll(); TreeNode right = queue.poll(); if (left == null && right == null) { // 都是空的,遍历到叶子节点了 continue; } else if (left == null || right == null) { // 有一个为null return false; } else if (left.val != right.val) { // 不相等. return false; } // 左子树入队 queue.add(left.left); queue.add(right.left); // 右子树入队 queue.add(left.right); queue.add(right.right); } return true; }}复制代码

其实我们本质上就是要比较左右两棵树,也没必要非要是队列,其实stack也是可以的,大同小异。所以并不是你记住哪种数据结构,关键是你能理解后,灵活应用.

public boolean isSameTree(TreeNode p, TreeNode q) {        if (p == null && q == null) {            return true;        } else if (p == null || q == null) {            return false;        }        Stack
stack = new Stack<>(); stack.push(p); stack.push(q); while(!stack.isEmpty()) { TreeNode left = stack.pop(); TreeNode right = stack.pop(); if (left == null && right == null) { continue; } else if (left == null || right == null) { return false; } else if (left.val != right.val) { return false; } stack.push(left.left); stack.push(right.left); stack.push(left.right); stack.push(right.right); } return true; }复制代码

相关阅读

转载地址:http://jwpox.baihongyu.com/

你可能感兴趣的文章
Distributed Configuration Management Platform(分布式配置管理平台)
查看>>
web.xml配置详解
查看>>
开源史上最成功的8个开源产品
查看>>
Maven学习总结(8)——使用Maven构建多模块项目
查看>>
Windows phone 应用开发[3]-UI 设计
查看>>
响应式网站案例及源码
查看>>
安装kvm的服务器开启vnc连接其虚拟机
查看>>
【VMware虚拟化解决方案】VMware VSphere 5.1配置篇
查看>>
C++11: chrono
查看>>
一天一个Linux基础命令之复制文件或目录命令cp
查看>>
细谈普通网站的后台构建实战----my note
查看>>
我的友情链接
查看>>
硬盘划分主分区、扩展分区、逻辑分区、活动分区有什么不同?
查看>>
进程通信QSharedMemory
查看>>
服务发现
查看>>
Linux Server - NAT
查看>>
在Windows XP里,设置USB只读
查看>>
bootstrap下拉列表与输入框组结合的样式调整
查看>>
Win32 多线程的创建方法,区别和联系
查看>>
我的友情链接
查看>>