剑指 Offer 28. 对称的二叉树

题目链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/

本文采用JavaScript进行解题:一、递归

 

一、递归

这题的递归解答与树的子结构中的递归解答很类似;参考大神jyd的解题思路

解题中很重要的是,精确找出相关结构的特性(当且仅当的性质:有此特性为此结构,此结构的具有此特性)

然后就是根据特性规律,考虑采用手段进行解题。

解题思路:
对称二叉树定义: 对于树中 任意两个对称节点 L和 R ,一定有:

  • L.val = R.valL.val=R.val :即此两对称节点值相等。
  • L.left.val = R.right.val :即 L 的 左子节点 和 R 的 右子节点 对称;
  • L.right.val = R.left.val :即 L 的 右子节点 和R 的 左子节点 对称。

根据以上规律,考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。

 1 /**
 2  * @param {TreeNode} root
 3  * @return {boolean}
 4  * 特殊处理:root == null: 对称
 5  */
 6 var isSymmetric = function (root) {
 7   if(root == null) return true;
 8   return recur(root.left, root.right);
 9 };
10 /**
11  * 当左右子树同时遍历超过叶子:对称
12  * 左右子树非同时遍历超过叶子:非对称
13  */
14 let recur = function(aNode, bNode) {
15   if(aNode == null && bNode == null) return true;
16   if(aNode == null || bNode == null) return false;
17   if(aNode.val != bNode.val) return false;
18   return recur(aNode.left, bNode.right) && recur(aNode.right, bNode.left);
19 }

 

posted @ 2021-11-29 11:36  不乏理想的三师弟  阅读(24)  评论(0)    收藏  举报