剑指offer 对称的二叉树

剑指offer 牛客网 对称的二叉树

说明:递归方式调试好了,非递归的方式有问题,尚未解决

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 10 14:18:42 2019

题目:
    请实现一个函数,用来判断一颗二叉树是不是对称的。
    注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
    递归方法:左右子节点递归遍历        
    非递归方法:按层序遍历的思路解决
"""

# -*- coding:utf-8 -*-
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    #非递归的方式,采用层序遍历的方式   (没有调试好,有问题,后期调试)
    def isSymmetrical(self, pRoot):
        # write code here
        if not pRoot:                           #如果为空节点,则为对称的               
            return True
        else:                                   
            temp = []                           #存放其各个节点的值
            index = 0
            temp.append(pRoot)                  #将头结点放入其中
            while index < len(temp):            #当下标超过其对应的长度时候便退出循环
                len_son = len(temp)
                while index < len_son:          #将当前下标的左右子节点加入其中
                    if temp[index]:             #判断当前节点是否为空节点
                        if temp[index].left:    #判断其左节点是否存在
                            temp.append(temp[index].left)#将其左节点加入其中
                        else:                   #不存在左子节点加入None
                            temp.append(None)
                    else:
                        temp.append(None)       #否则为叶子节点,加入两个空节点
                        temp.append(None)
                    if temp[index]:
                        if temp[index].right:
                            temp.append(temp[index].right)
                        else:
                            temp.append(None)
                    else:
                        temp.append(None)
                        temp.append(None)
                    index += 1
                                                
                pre_index = index + 1           
                tail_index = len(temp)-1
                while pre_index < tail_index:   #比较,两边往中间缩
                    if temp[pre_index].val != temp[tail_index].val:
                        return False
                    pre_index += 1
                    tail_index -= 1
            print(temp)
            return True
    #采用递归的方式
    def RisSymmetrical(self, pRoot):
        if not pRoot:                           #如果为空节点,是对称的
            return True
        if pRoot.left and not pRoot.right:      #如果有左没有右,则是不对称的
            return False
        if pRoot.right and not pRoot.left:      #如果有右没有左,则是不对称的
            return False
        def IsSame(left,right):
            if not left and not right:          #如果左右都为空节点,则为对称的
                return True
                                                #左右节点存在,并且其值相等,便递归的调用下去
            if (left and right) and left.val == right.val:
                                                #传入(左左,右右) (左右,右左)
                return IsSame(left.left,right.right) and IsSame(left.right,right.left)
        return IsSame(pRoot.left,pRoot.right)   #递归调用传入左节点和右节点
        
if __name__ == '__main__':
    solution = Solution()
     #1 2 3 4 5 6 7 
    node_left = TreeNode(1)
    node_right = TreeNode(3)
    root_left = TreeNode(2)
    root_left.left = node_left
    root_left.right = node_right
    
    node_left = TreeNode(3)
    node_right = TreeNode(1)
    root_right = TreeNode(2)
    root = TreeNode(4)
    root.left = root_left
    root_right.left = node_left
    root_right.right = node_right
    root.right = root_right
    #非递归的方式
    res = solution.isSymmetrical(root)
    print(res)
    #递归的方式
    res = solution.RisSymmetrical(root)
    print(res)

 

posted @ 2019-04-10 17:13  weilongyitian  阅读(189)  评论(0编辑  收藏  举报