笔试面试题目:对称树的判断

     原文发表于:

20200104213843347.gif

      周六,被外面的施工给吵醒了,以往没这种情况啊,不知道他们在干啥。今天,我们来聊一下对称树的判断。

     这些年来,我不断地忽悠朋友们去BATH, 促进人才流动,自己也能顺便获取一些好处。

     S哥便是我忽悠的目标之一,S哥是某985土木工程专业出身,后来转行做了程序员,去T公司面试,碰到这样一道题目(一看就是leetcode中的easy级别问题):

       我们来分析一下这个问题,如下图所示,假定root的左子树和右子树都存在,那么root树对称的充分必要条件是:root.Left和root.Right是两棵彼此对称的树。

      如何判断root.Left和root.Right是两棵彼此对称的树呢?必须且只需满足如下三个条件:

      a. root.Left.Val = root.Right.Val, 即上图中的3.

      b. root.Left的左子树和root.Right的右子树彼此对称,即上图中的2, -1.

      c. root.Left的右子树和root.Right的左子树彼此对称,即上图中的4, 9.

     

      显然,这是一个递归问题。

      通过分析拆解,原问题不攻自破。话不多说,直接上代码:

func isSymmetric(root *TreeNode) bool {
    if root == nil {
        return true
    }

    if root.Left == nil && root.Right != nil {
        return false
    }

    if root.Left != nil && root.Right == nil {
        return false
    }

    return checkTwoSymmetric(root.Left, root.Right) 
}

func checkTwoSymmetric(p, q *TreeNode) bool {
    if p == nil && q == nil {
        return true
    }

    if p == nil && q != nil {
        return false
    }

    if p != nil && q == nil {
        return false
    }

    if p.Val == q.Val {
        return checkTwoSymmetric(p.Left, q.Right) && checkTwoSymmetric(p.Right, q.Left);
    }

    return false;
}

      在leetcode上进行了自测,通过。类似地,我们也可以判断两棵树是否为相同的树,代码就更简单了,故不赘述。

      遇到问题,要学会分解,然后各个击破。最后说一下,S哥心比天高,有理想有追求,祝贺S哥拿到T公司的offer,我相信,这不是终点。

猜你喜欢

转载自blog.csdn.net/stpeace/article/details/110419760
今日推荐