📜  检查二叉树的中序遍历是否为回文(1)

📅  最后修改于: 2023-12-03 14:55:44.266000             🧑  作者: Mango

检查二叉树的中序遍历是否为回文

在二叉树的中序遍历中,如果节点的值满足回文的条件,即正着读和倒着读的结果相同,那么这棵二叉树的中序遍历就是回文的。本文将介绍如何检查一棵二叉树的中序遍历是否为回文,并给出示例代码。

解法

要检查一棵二叉树的中序遍历是否为回文,首先要获取该二叉树的中序遍历结果。对于一棵二叉树,其中序遍历结果应该是一个有序的数组,可以通过中序遍历算法来得到。得到中序遍历结果后,需要判断这个结果是否为回文。

判断回文可以用两个指针从两端向中间扫描的方式,具体实现可以用一个指针指向字符串的头部,另一个指针指向字符串的尾部,向中间靠拢,每次比较指针所指向的字符是否相同。如果比较完所有字符都相同,则说明该字符串是回文。

应用到二叉树的中序遍历中,就是对于中序遍历结果数组,用两个指针指向头部和尾部,每次比较两个指针所指向的元素是否相同。如果比较完所有元素都相同,则说明中序遍历结果是回文。

代码实现

下面给出 Java 语言的示例代码实现。

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int val) {
        this.val = val;
    }
}

public class PalindromicInorderTraversal {

    private List<Integer> inorderList = new ArrayList<>();

    public boolean isPalindrome(TreeNode root) {
        inorderTraversal(root);
        int i = 0;
        int j = inorderList.size() - 1;
        while (i < j) {
            if (inorderList.get(i) != inorderList.get(j)) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }

    // 中序遍历二叉树
    private void inorderTraversal(TreeNode root) {
        if (root != null) {
            inorderTraversal(root.left);
            inorderList.add(root.val);
            inorderTraversal(root.right);
        }
    }

}

代码中,定义了一个 PalindromicInorderTraversal 类。该类中有一个 isPalindrome 方法,用于检查一棵二叉树的中序遍历结果是否为回文。该方法使用了先中序遍历二叉树,并记录下遍历结果的方式。然后,定义两个指针 ij,分别指向中序遍历结果数组的头部和尾部。每次移动指针时,比较指针所指向的元素是否相同。如果比较完所有元素都相同,则说明中序遍历结果是回文,返回 true;否则,返回 false

测试用例

为了验证上述代码的正确性,可以写一些测试用例进行测试。下面给出一些测试用例:

@Test
public void test() {
    /*
     * 构造一棵二叉树:
     *       1
     *      / \
     *     2   2
     *    / \ / \
     *   3  4 4  3
     */
    TreeNode root1 = new TreeNode(1);
    TreeNode node1 = new TreeNode(2);
    TreeNode node2 = new TreeNode(2);
    TreeNode node3 = new TreeNode(3);
    TreeNode node4 = new TreeNode(4);
    TreeNode node5 = new TreeNode(4);
    TreeNode node6 = new TreeNode(3);
    root1.left = node1;
    root1.right = node2;
    node1.left = node3;
    node1.right = node4;
    node2.left = node5;
    node2.right = node6;

    /*
     * 构造一棵二叉树:
     *       1
     *      / \
     *     2   2
     *    / \   \
     *   3  4   3
     */
    TreeNode root2 = new TreeNode(1);
    TreeNode node7 = new TreeNode(2);
    TreeNode node8 = new TreeNode(2);
    TreeNode node9 = new TreeNode(3);
    TreeNode node10 = new TreeNode(4);
    TreeNode node11 = new TreeNode(3);
    root2.left = node7;
    root2.right = node8;
    node7.left = node9;
    node7.right = node10;
    node8.right = node11;

    /*
     * 测试二叉树1
     * 预期结果:中序遍历结果为 [3,2,4,1,4,2,3],是回文的
     */
    boolean isPalindrome1 = new PalindromicInorderTraversal().isPalindrome(root1);
    Assert.assertTrue(isPalindrome1);

    /*
     * 测试二叉树2
     * 预期结果:中序遍历结果为 [3,2,4,1,3,2,3],不是回文的
     */
    boolean isPalindrome2 = new PalindromicInorderTraversal().isPalindrome(root2);
    Assert.assertFalse(isPalindrome2);
}

上述测试用例分别验证了一棵中序遍历结果为回文的二叉树和一棵中序遍历结果不是回文的二叉树,分别测试过了说明代码正确。