php怎么看二叉树对称
-
要判断一个二叉树是否为对称二叉树,可以使用递归的方法。具体步骤如下:
1. 首先,先编写一个辅助函数`isMirror()`,该函数接受两个节点作为参数,用于判断两个节点是否对称。
2. 在`isMirror()`函数中,首先判断两个节点是否同时为空,如果是,则返回`True`。
3. 然后,判断两个节点是否有一个为空,如果是,则返回`False`。
4. 接下来,判断两个节点的值是否相等,如果不相等,则返回`False`。
5. 最后,递归地判断左节点的左子树与右节点的右子树是否对称,以及左节点的右子树与右节点的左子树是否对称,如果都对称,则返回`True`;否则返回`False`。
下面是使用PHP实现的示例代码:
“`php
class TreeNode {
public $val;
public $left;
public $right;function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}function isSymmetric($root) {
if ($root == null) {
return true;
}
return isMirror($root->left, $root->right);
}function isMirror($node1, $node2) {
if ($node1 == null && $node2 == null) {
return true;
}
if ($node1 == null || $node2 == null) {
return false;
}
return ($node1->val == $node2->val)
&& isMirror($node1->left, $node2->right)
&& isMirror($node1->right, $node2->left);
}
“`通过调用`isSymmetric()`函数,可以判断给定的二叉树是否对称。如果返回值为`True`,则表示二叉树对称;如果返回值为`False`,则表示二叉树不对称。
2年前 -
要判断一个二叉树是否对称,可以采用递归和迭代两种方法。
方法一:递归法
递归法是通过比较镜像位置节点的值来判断二叉树是否对称。首先将根节点的左右子树传入递归函数,再比较左右子树的值是否相等,如果相等,则递归比较左子树的左节点和右子树的右节点,以及左子树的右节点和右子树的左节点。如果所有的节点都满足这个条件,则说明二叉树对称。具体步骤如下:
1. 定义一个递归函数 `isSymmetricHelper()` 来判断两个节点是否镜像对称。
2. 在 `isSymmetric()` 函数中判断根节点是否为空,若为空则返回 `true`,否则调用 `isSymmetricHelper()` 函数。
3. 在 `isSymmetricHelper()` 函数中判断两个节点 `left` 和 `right` 是否为空,若同时为空则返回 `true`,若其中一个为空则返回 `false`。
4. 判断 `left` 和 `right` 节点的值是否相等,若不相等则返回 `false`。
5. 递归调用 `isSymmetricHelper()` 函数,比较 `left` 的左子节点和 `right` 的右子节点,以及 `left` 的右子节点和 `right` 的左子节点。示例代码如下:
“`php
class TreeNode {
public $val;
public $left;
public $right;function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}function isSymmetric($root) {
if ($root == null) {
return true;
}
return isSymmetricHelper($root->left, $root->right);
}function isSymmetricHelper($left, $right) {
if ($left == null && $right == null) {
return true;
}
if ($left == null || $right == null) {
return false;
}
if ($left->val != $right->val) {
return false;
}
return isSymmetricHelper($left->left, $right->right) && isSymmetricHelper($left->right, $right->left);
}// 测试用例
$root = new TreeNode(1);
$root->left = new TreeNode(2);
$root->right = new TreeNode(2);
$root->left->left = new TreeNode(3);
$root->left->right = new TreeNode(4);
$root->right->left = new TreeNode(4);
$root->right->right = new TreeNode(3);$result = isSymmetric($root);
if ($result) {
echo “二叉树是对称的”;
} else {
echo “二叉树不是对称的”;
}“`
方法二:迭代法
迭代法是通过辅助数据结构(例如队列)来判断二叉树是否对称。首先将根节点的左右子节点入队列,在每一轮的迭代中,取出队列中的两个节点进行比较,若值不相等则直接返回 `false`,否则将它们的左右子节点按相反顺序入队列。当队列为空时,说明二叉树对称。具体步骤如下:
1. 定义一个队列,并将根节点的左右子节点入队列。
2. 迭代队列,每次取出两个节点进行比较。
3. 比较节点的值,若不相等则返回 `false`。
4. 将两个节点的左右子节点按相反顺序入队列。
5. 重复步骤2-4,直到队列为空。示例代码如下:
“`php
class TreeNode {
public $val;
public $left;
public $right;function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}function isSymmetric($root) {
if ($root == null) {
return true;
}
$queue = [];
array_push($queue, $root->left, $root->right);
while (!empty($queue)) {
$left = array_shift($queue);
$right = array_shift($queue);
if ($left == null && $right == null) {
continue;
}
if ($left == null || $right == null || $left->val != $right->val) {
return false;
}
array_push($queue, $left->left, $right->right);
array_push($queue, $left->right, $right->left);
}
return true;
}// 测试用例
$root = new TreeNode(1);
$root->left = new TreeNode(2);
$root->right = new TreeNode(2);
$root->left->left = new TreeNode(3);
$root->left->right = new TreeNode(4);
$root->right->left = new TreeNode(4);
$root->right->right = new TreeNode(3);$result = isSymmetric($root);
if ($result) {
echo “二叉树是对称的”;
} else {
echo “二叉树不是对称的”;
}
“`以上就是判断二叉树是否对称的两种方法,分别是递归法和迭代法。可以根据实际情况选择使用哪种方法来解决问题。
2年前 -
要判断一棵二叉树是否对称,可以使用递归的方式进行判断。递归的思路是比较根节点的左子树和右子树是否对称,同时比较左子树的左子树和右子树的右子树、左子树的右子树和右子树的左子树是否对称。下面是具体的操作步骤:
1. 编写一个递归函数`isSymmetricHelper($left, $right)`,该函数用于判断以左右两个节点为根节点的子树是否对称。函数的返回值为布尔值,表示子树是否对称。
2. 在`isSymmetricHelper`函数中,首先判断左节点和右节点是否同时为空,如果是,则表明子树对称,返回`true`。
3. 然后判断左节点和右节点是否有一个为空,或者两个节点的值不相等,如果是,则表明子树不对称,返回`false`。
4. 如果左节点和右节点都不为空,且两个节点的值相等,则继续递归判断左节点的左子树和右节点的右子树是否对称,以及左节点的右子树和右节点的左子树是否对称。如果两个子树都对称,则返回`true`,否则返回`false`。
5. 最后,在主函数中调用`isSymmetricHelper`函数,传入二叉树的根节点,即可判断整棵二叉树是否对称。
下面是一个使用PHP语言实现的例子:
“`php
class TreeNode {
public $val;
public $left;
public $right;public function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}function isSymmetric($root) {
if ($root == null) {
return true;
}
return isSymmetricHelper($root->left, $root->right);
}function isSymmetricHelper($left, $right) {
if ($left == null && $right == null) {
return true;
}
if ($left == null || $right == null || $left->val != $right->val) {
return false;
}
return isSymmetricHelper($left->left, $right->right) && isSymmetricHelper($left->right, $right->left);
}// 测试
$root = new TreeNode(1);
$root->left = new TreeNode(2);
$root->right = new TreeNode(2);
$root->left->left = new TreeNode(3);
$root->left->right = new TreeNode(4);
$root->right->left = new TreeNode(4);
$root->right->right = new TreeNode(3);if (isSymmetric($root)) {
echo “二叉树是对称的”;
} else {
echo “二叉树不是对称的”;
}
“`以上代码中,我们创建了一个`TreeNode`类来表示二叉树的节点。然后定义了`isSymmetric`函数和`isSymmetricHelper`函数,并在主函数中调用`isSymmetric`函数进行测试。
注意:上述代码是基于leetcode题目101. 对称二叉树的要求所写的。如需应用于其他题目或场景,请根据实际情况进行相应的调整。
2年前