leetcode 101 : 对称二叉树

题目

算法思想 :题目提示递归和迭代两种方法,是告诉我们这道题目可以用深度优先搜索和广度优先搜索两种方法。

(1)深度优先搜索 DFS

          我们主要用递归实现,比较简单。开始搜索根的左右子树,搜索到第三层及以后的时候我们要注意除了判断节点值val是否相等以外,继续向下搜索的时候要搜索 (左边子树的左节点和右边子树的右节点) && (左边子树的右节点和右边子树的左节点)

bool dfs(TreeNode* p,TreeNode* q)
{
    if(p == NULL && q == NULL)
        return true;
    if(p == NULL)
        return false;
    if(q == NULL)
        return false;
    if(p != NULL && q != NULL)
         if(p->val == q->val)
             return (dfs(p->left,q->right) && dfs(p->right,q->left) );
         else
             return false;
    return true;
}
bool isSymmetric(TreeNode* root) {
    if(root == NULL)
        return true;
    return dfs(root->left,root->right); 
}

 

(2) 广度优先搜索 BFS

           这个搜索方式主要是我们一层一层的判断,所以我们定义两个队列存放左右子树的搜索过程。值得注意的是左边子树入队的时候先插入左节点再插入右节点,右边子树先插入右边节点再插入左边节点。我们把队列的队首节点出队的时候,把它的左右子树插入到队尾,循环结束条件就是队列都为空。

        

 bool bfs(TreeNode* root)
{
    TreeNode* l,*r;
    queue<TreeNode*> a,b;
    a.push(root->left);
    b.push(root->right);
    while(!a.empty() && !b.empty())
    {
        l = a.front();
        r = b.front();
        if(l == NULL && r == NULL)
        {
            a.pop();
            b.pop();
            continue;
        }
        if(l == NULL)
            return false;
        if(r == NULL)
            return false;
        if(l->val != r->val)
            return false;
        else
        {
            a.push(l->left);
            a.push(l->right);
            a.pop();
            b.push(r->right);
            b.push(r->left);
            b.pop();
        }
    }
    return true;
}
bool isSymmetric(TreeNode* root) {
    if(root == NULL)
        return true;
    return bfs(root); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值