剑指Offer_刷题Day4

剑指Offer_刷题Day4

早上说起来很是挺生气的,有的人你给他发消息,估计是看见了,但就没有回。
仔细想想,何必和这种人较气呢?就是觉得很可笑,何必呢?

Q1:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路

  • 递归,但要保存两个节点

Code

python

class Solution:
    def SubGetNext(self, Node1, Node2):
        #print(Node1.val,Node2.val)
        if Node1 == None:
            return None
        if Node2 == Node1.left:
            return Node1
        if Node2 == Node1.right:
            return self.SubGetNext (Node1.next, Node1)
        if Node2 == Node1.next:
            if Node1.left != None:
                return self.SubGetNext (Node1.left, Node1)
            return Node1
 
    def GetNext(self, pNode):
        # write code here
        if pNode == None:
            return None
        tmpNode = pNode
        if tmpNode.right != None:
            return self.SubGetNext (tmpNode.right, tmpNode)
        return self.SubGetNext (tmpNode.next, tmpNode)

Q2:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

思路

  • BFS

Code

python

# -*- 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
        p=pRoot
        if p==None:
            return True
        Li1=[p]
        Count=1
        while Count!=0:
            Count=0
            Litmp1=[]
            for i in Li1:
                if i !=None:
                    if i.left!=None:
                        Count+=1
                    if i.right!=None:
                        Count+=1
                    Litmp1.append(i.left)
                    Litmp1.append(i.right)
                else:
                    Litmp1.append(None)
                    Litmp1.append(None)
            N=len(Litmp1)
            for i in range(len(Litmp1)//2):
                if Litmp1[i]==None and Litmp1[N-i-1]==None:
                    pass
                else:
                    if Litmp1[i]==None or Litmp1[N-i-1]==None:
                        return False
                    else:
                        if Litmp1[i].val!=Litmp1[N-i-1].val:
                            return False
            Li1=Litmp1
        return True

Q3:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路

  • BFS

Code

python

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Print(self, pRoot):
        # write code here
        Res=[]
        flag=1
        p=pRoot
        if p==None:
            return []
        Li=[p]
        while Li!=[]:
            Li2=[]
            for i in Li:
                if i.left!=None:
                    Li2.append(i.left)
                if i.right!=None:
                    Li2.append(i.right)
            PrintArray=[i.val for i in Li]
            if flag==-1:
                PrintArray=PrintArray[::-1]
            Res.append(PrintArray)
            flag*=-1
            Li=Li2
        return Res

猜你喜欢

转载自blog.csdn.net/weixin_43982484/article/details/89743014