对称二叉树

对称二叉树

一、题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。例如下面的二叉树:

 思路:如果根节点为null,返回true。然后判断左子树和右子树是否对称。

二、代码演示

public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null) return true;
        return search(pRoot.left,pRoot.right);
    }
    
    boolean search(TreeNode node1,TreeNode node2) {
        if(node1 == null && node2 == null) return true;
        if(node1 == null && node2 != null || node1 != null && node2 == null) return false;
        if(node1.val != node2.val) return false;
        return search(node1.left,node2.right) && search(node1.right,node2.left);
    }
}

 

posted @ 2018-08-20 10:31 neu_张康 阅读( ...) 评论( ...) 编辑 收藏
### 判断对称二叉树的算法 要判断一个二叉树是否为对称二叉树,核心在于验证该二叉树的左子树和右子树是否关于根节点呈镜像对称。具体来说,可以通过递归或迭代的方式完成这一任务。 #### 定义对称二叉树 对称二叉树是指对于每一层上的节点,其对应的左右子树在结构上互为镜像,并且对应位置的节点值相等[^1]。这意味着不仅需要满足结构对称的要求,还需要保证数据的一致性[^3]。 #### 递归解法 递归的核心思想是比较两个子树是否镜像对称。具体而言,需检查以下条件: - 如果当前比较的两个节点都为空,则它们是对称的。 - 如果其中一个节点为空而另一个不为空,或者两者都不为空但值不同,则不对称。 - 若上述情况均未发生,则继续递归地比较左子树的左孩子与右子树的右孩子,以及左子树的右孩子与右子树的左孩子[^4]。 以下是基于 Python 的递归实现: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isSymmetric(root: TreeNode) -> bool: def check(p, q): if not p and not q: # 两个节点都为空 return True if not p or not q: # 其中一个节点为空 return False return (p.val == q.val) and check(p.left, q.right) and check(p.right, q.left) if not root: return True return check(root.left, root.right) ``` 此代码通过辅助函数 `check` 实现了递归逻辑,用于逐层对比左右子树中的相应节点[^5]。 #### 迭代解法 除了递归外,还可以采用队列来模拟层次遍历的过程。每次从队列中取出一对节点并进行比较,随后按顺序将这些节点的孩子加入队列以便后续处理。 下面是使用 C++ 编写的迭代版本示例: ```cpp #include <queue> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; bool isSymmetric(TreeNode* root) { if (!root) return true; // 空树视为对称 queue<TreeNode*> q; q.push(root->left); q.push(root->right); while (!q.empty()) { TreeNode* node1 = q.front(); q.pop(); TreeNode* node2 = q.front(); q.pop(); if (!node1 && !node2) continue; // 两个节点均为 NULL if (!node1 || !node2) return false; // 仅有一个节点为 NULL if (node1->val != node2->val) return false; // 值不匹配 // 将下一层的节点按照相反顺序入队 q.push(node1->left); q.push(node2->right); q.push(node1->right); q.push(node2->left); } return true; } ``` 这种方法利用队列实现了广度优先搜索(BFS),从而避免显式的递归调用栈开销[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值