二叉树

Problem 1

判断是否是镜像二叉树
考察点:二叉树的遍历
Description:

image.png

(1)自己的解法:
镜像二叉树的两种不同的遍历:先遍历左子树和先遍历右子树,遍历的顺序结果是一样的,代码如下:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        p_l=[]
        p_r=[]
        def midTraverse(root):

            if root == None:
                p_l.append('null')
                return
            p_l.append(root.val)
            midTraverse(root.left)
            midTraverse(root.right)

        def afterTraverse(root):
            if root == None:
                p_r.append('null')
                return
            p_r.append(root.val)
            afterTraverse(root.right)
            afterTraverse(root.left)
        
        midTraverse(root)
        afterTraverse(root)
        print(p_l)
        print(p_r)
        return p_l==p_r 

这个方法的时间复杂度有点高,需要两次遍历。
(2)参考的网上的代码:
思路递归的比较树的左子树和右子树是否相似,代码如下:

class Solution:
  def isSymmetric(self, root):
    if root is None:
      return True
    else:
      return self.isMirror(root.left, root.right)

  def isMirror(self, left, right):
    if left is None and right is None:
      return True
    if left is None or right is None:
      return False

    if left.val == right.val:
      outPair = self.isMirror(left.left, right.right)
      inPiar = self.isMirror(left.right, right.left)
      return outPair and inPiar
    else:
      return False

Problem 2

翻转二叉树
Description

image.png

(1)自己的想法:
层次遍历原二叉树,维护一个新的节点的队列,不断修改新的树节点的值,返回新的树的根节点(开始前需要保存一下,后续遍历过程中会修改)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if root == None:
            return
        queue = []
        queue_r=[]
        queue.append(root)
        p=TreeNode(root.val)
        queue_r.append(p)
        q=p
        while queue:
            now_node = queue.pop(0)
            p=queue_r.pop(0)
            if now_node.right != None:
                queue.append(now_node.right)
                p.left=TreeNode(now_node.right.val)
                queue_r.append(p.left)
            if now_node.left != None:
                queue.append(now_node.left)
                p.right=TreeNode(now_node.left.val)
                queue_r.append(p.right)
        return q

这个方法的空间复杂度有点高,每次都会开辟一个新的节点,参考网上其他的解法代码如下,其中

 node.left, node.right = node.right, node.left

这条代码表示并发执行

# BFS
def invertTree2(self, root):
    queue = collections.deque([(root)])
    while queue:
        node = queue.popleft()
        if node:
            node.left, node.right = node.right, node.left
            #此时node.left和node.right已经调换过来了
            queue.append(node.left)
            queue.append(node.right)
    return root
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容