博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
101. Symmetric Tree - Easy
阅读量:5836 次
发布时间:2019-06-18

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

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

1   / \  2   2 / \ / \3  4 4  3

 

But the following [1,2,2,null,3,null,3] is not:

1   / \  2   2   \   \   3    3

 

Note:

Bonus points if you could solve it both recursively and iteratively.

 

M1: recursive

time: O(n)  -- n: total # of nodes in the tree, space: O(height)

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public boolean isSymmetric(TreeNode root) {        if(root == null || root.left == null && root.right == null) {            return true;        }        return isSymmetric(root.left, root.right);    }        public boolean isSymmetric(TreeNode t1, TreeNode t2) {        if(t1 == null && t2 == null) {            return true;        }        if(t1 == null || t2 == null) {            return false;        }        if(t1.val != t2.val) {            return false;        }        return isSymmetric(t1.left, t2.right) && isSymmetric(t1.right, t2.left);    }}

 

M2: iterative

Instead of recursion, we can also use iteration with the aid of a queue. Each two consecutive nodes in the queue should be equal, and their subtrees a mirror of each other. Initially, the queue contains root and root. Then the algorithm works similarly to BFS, with some key differences. Each time, two nodes are extracted and their values compared. Then, the right and left children of the two nodes are inserted in the queue in opposite order. The algorithm is done when either the queue is empty, or we detect that the tree is not symmetric (i.e. we pull out two consecutive nodes from the queue that are unequal).

time: O(n), space: O(n)  -- worst case need to store n nodes in the queue

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public boolean isSymmetric(TreeNode root) {        Queue
q = new LinkedList<>(); q.offer(root); q.offer(root); while(!q.isEmpty()) { TreeNode t1 = q.poll(); TreeNode t2 = q.poll(); if(t1 == null && t2 == null) { continue; } if(t1 == null || t2 == null) { return false; } if(t1.val != t2.val) { return false; } q.add(t1.left); q.add(t2.right); q.add(t1.right); q.add(t2.left); } return true; }}

 

转载于:https://www.cnblogs.com/fatttcat/p/10188694.html

你可能感兴趣的文章
Java中需要注意的一些案例
查看>>
虚拟运营商10月或大面积放号 哭穷背后仍有赢家
查看>>
Server2016开发环境配置
查看>>
分布式光伏发电建设中的逆变器及其选型
查看>>
发展物联网 构建智能连接
查看>>
增强网络安全防御 推动物联网走向应用
查看>>
UML中关联,组合与聚合等关系的辨析
查看>>
《大数据管理概论》一3.2 大数据存储与管理方法
查看>>
《R语言数据挖掘》----1.10 数据属性与描述
查看>>
PowerBuilder开发简单计算器
查看>>
从HDFS看分布式文件系统的设计需求
查看>>
怎样使用linux的iptables工具进行网络共享
查看>>
《HTML5与CSS3实战指南》——导读
查看>>
RHEL6下安装oracle 10g(一)
查看>>
Redhat 7 httpd 显示wsgi页面
查看>>
mysql的binlog
查看>>
Kconfig的格式
查看>>
禁止用户更改IP地址的设置方法有哪些
查看>>
【更新】Word组件Spire.Doc for .NET V6.0.21发布 | 附下载
查看>>
软件测试流程
查看>>