二叉树镜像

2018-04-11  本文已影响9人  analanxingde

判断一个二叉树是不是镜像的

思路:
定义一种先遍历右子树再遍历左子树的遍历方法,与相应的对称遍历结果一致,则证明二叉树对称。
对于树的遍历,一般采用的方法为递归。
只需要分别考察:R1->left与R2->right比较,R2->left与R1->right比较即可。
注意:为了能够将两字小子树传入,需再定以一个两个参数的函数。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if(pRoot==nullptr)
            return true;
        return isSymmetrical(pRoot,pRoot);
    }
    bool isSymmetrical(TreeNode* pLeft,TreeNode* pRight)
    {
        if(pLeft==nullptr && pRight==nullptr)
            return true;
        if(pLeft==nullptr || pRight==nullptr)
            return false;
        if(pLeft->val!=pRight->val)
            return false;
        return isSymmetrical(pLeft->right,pRight->left) && isSymmetrical(pLeft->left,pRight->right);
    }

};

求一个二叉树的镜像

思路:对于每一个子树自底向上调用mirror操作,然后对顶部的两个左右子树指针进行操作。

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    void Mirror(TreeNode *pRoot) {
        if(pRoot==nullptr||(pRoot->left==nullptr &&pRoot->right==nullptr))
            return;
        if(pRoot->left!=nullptr)
            Mirror(pRoot->left);
        if(pRoot->right!=nullptr)
            Mirror(pRoot->right);
        TreeNode* temp=new TreeNode(0);//中间辅助节点
        temp=pRoot->right;
        pRoot->right=pRoot->left;
        pRoot->left=temp;

    }
};
上一篇 下一篇

猜你喜欢

热点阅读