镜像二叉树,力扣上面的的题目,这道题很简单,放出来的原因是它要求用两种解法来写这道题——递归和迭代,而且数据结构学到了树,记录自己学习的过程,以免忘了,没地方找。

题目的意图很明显,就是然你写个程序看看是不是对称的,对称的条件很明显:

//左子树点值等于右子树的值
        LeftChild->val == RightChild->val
    

  然后我们想一想什么样的树被称为镜像对称?

是不是当一个树的左子树与右子树镜像对称,那么这个树是对称的。那么问题是不是可以转化成:两个树在什么情况下互为镜像?

  很明显

当子树相互对称应该符合一下条件:

  1、它们的两个根结点具有相同的值。

  2、每个树的右子树都与另一个树的左子树镜像对称。

//力扣给的结构体
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

;现在让我来想想递归如何实现

  1、递归就会有终止条件,那么这个函数什么时候表示递归结束呢?

    当然是到达树的这一分支的最大深度。那么如何检测递归到了树的这一分支的最大深度,很显然每一棵二叉树,如果它不是根节点,那么,当该节点的左右子树都为空时,表示这树的这一支就兜底了。

    由于这是镜像二叉树的题而不是测深度,所以我们返回的条件有三种:

    第一种,两个节点都为空,返回 true;

    第二种,两个节点不都为空 ,返回 false;

    第三种,两个节点的值不相等,返回 false;

得出了终止条件递归就基本成型了,就剩下迭代了,迭代这个较为简单,不在这里赘述了。

贴代码:

  

bool CheckVal(struct TreeNode* LeftChild, struct TreeNode* RightChild)
{
    if (NULL == LeftChild && NULL == RightChild)
    {
        return true;
    }
    if (NULL == LeftChild || NULL == RightChild)
    {
        return false;
    }
    return (LeftChild->val == RightChild->val) && CheckVal(LeftChild->left, RightChild->right) && CheckVal(LeftChild->right, RightChild->left);
}

bool isSymmetric(struct TreeNode* root){
    if (NULL == root)
    {
        return true;
    }
    return CheckVal(root->left, root->right);
}

  迭代就不做细说了,这个实现起来太简单了,BFS略微改改就行了

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
#define MAXSIZE 1024

bool isSymmetric(struct TreeNode* root){
    struct TreeNode *Queue[MAXSIZE];
    int index = 0;
    Queue[index++] = root;
    Queue[index++] = root;

    while (0 != index)
    {
        struct TreeNode *leftChild = Queue[--index];
        struct TreeNode *rightChild = Queue[--index];

        if (NULL == leftChild && NULL == rightChild)
        {
            continue;
        }
        if ((NULL == leftChild || NULL == rightChild) || (leftChild->val != rightChild->val))
        {
            return false;
        }

        Queue[index++] = leftChild->left;
        Queue[index++] = rightChild->right;
        Queue[index++] = leftChild->right;
        Queue[index++] = rightChild->left;
    }
    return true;
}

  好吧,我这个更像栈一点。

算法不易,诸君共勉!

02-12 21:45