剑指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