返回

镜中世界:探寻对称二叉树的奥秘

前端

引言

在二叉树的浩瀚世界中,对称二叉树以其优雅的结构和镜像对称的特性而著称。想象一棵二叉树,它的左子树的镜像与它的右子树完全相同,宛如一面镜子。这种对称性赋予了对称二叉树独特的魅力,也使其在计算机科学中颇具价值。

递归方法

判断对称二叉树最直接的方法之一是采用递归。递归是一种将问题分解为更小实例并反复调用自身的方法。对于对称二叉树,我们可以将判断过程分解为检查其子树是否对称:

bool isSymmetric(TreeNode* root) {
  if (!root) return true;
  return isMirror(root->left, root->right);
}

bool isMirror(TreeNode* left, TreeNode* right) {
  if (!left && !right) return true;
  if (!left || !right) return false;
  return left->val == right->val && isMirror(left->left, right->right) && isMirror(left->right, right->left);
}

在递归过程中,我们首先检查根节点是否为空,如果是,则返回真,表示空树是对称的。然后,我们递归地检查左右子树是否镜像对称,只有当左右子树都对称,且根节点的值相等时,我们才返回真。

迭代方法

除了递归方法,我们还可以使用迭代来判断对称二叉树。迭代方法通过使用队列或栈等数据结构,逐层遍历二叉树,并比较对应位置的节点:

bool isSymmetric(TreeNode* root) {
  if (!root) return true;
  queue<TreeNode*> q;
  q.push(root->left);
  q.push(root->right);

  while (!q.empty()) {
    TreeNode* left = q.front(); q.pop();
    TreeNode* right = q.front(); q.pop();

    if (!left && !right) continue;
    if (!left || !right || left->val != right->val) return false;

    q.push(left->left);
    q.push(right->right);
    q.push(left->right);
    q.push(right->left);
  }

  return true;
}

迭代方法中,我们使用队列存储二叉树的节点。每一步,我们比较队列中的对应位置的节点,如果它们都为空,则继续;如果它们有一个为空或值不相等,则返回假;否则,我们将它们的左子节点和右子节点分别加入队列。

结论

对称二叉树是一个迷人的计算机科学概念,其镜像对称的特性使其在算法和数据结构中具有广泛的应用。通过理解递归和迭代这两种方法,我们可以深入探究对称二叉树的本质,并掌握判断一棵二叉树是否是对称的技巧。