二叉树的递归遍历非常简单
def qxbl(root):#前序遍历
if root == None:return
else:
print(root.val)
qxbl(root.left)
qxbl(root.right)
def zxbl(root):#中序遍历
if root == None:return
else:
zxbl(root.left)
print(root.val)
zxbl(root.right)
def hxbl(root):#后序遍历
if root == None:return
else:
hxbl(root.left)
hxbl(root.right)
print(root.val)
认真比对一下,你就会发现他们之间的差别就是print(root.val)的位置不一样,也就是访问父结点的顺序不一样。
先访问父结点的叫前序遍历,最后访问父结点的叫后序遍历,先访问左子结点再访问父结点就是中序遍历
层序遍历也很简单
常见的写法是用栈
def cxbl(root):
if not root:return
lis = []
lis.append(root)
while lis:
if lis[0].left:lis.append(lis[0].left)
if lis[0].right:lis.append(lis[0].right)
print(lis[0].val)
del lis[0]
我这里用了del是因为我不想写那么长的代码,但是程序的速度会降低很多
二叉搜索树有一个特点,就是它中序遍历得出的结果是一个有序的序列
所以可以利用这一个特点解开第一道题。
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def bianli(p,lis):
if p == None:return
else:
bianli(p.left,lis)
lis.append(p.val)
bianli(p.right,lis)
lis = []
bianli(root,lis)
for i in range(len(lis)-1):
if lis[i] >= lis[i+1]:return False
return True
把上面的改进一下就好了
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root :return []
lis1 = []
lis1.append(root)
lis2 = []
rlis = []#返回数组
while lis1:
lis3 = []#存储数组
while lis1:
if lis1[0].left:
lis2.append(lis1[0].left)
if lis1[0].right:
lis2.append(lis1[0].right)
lis3.append(lis1[0].val)
del(lis1[0])
rlis.append(lis3)
lis1 = lis2
lis2 = []
return rlis
这道题好奇葩啊
跟上一道题差不多,然鹅难度是简单
class Solution(object):
def levelOrderBottom(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root :return []
lis1 = []
lis1.append(root)
lis2 = []
rlis = []
while lis1:
lis3 = []#存储数组
while lis1:
if lis1[0].left:
lis2.append(lis1[0].left)
if lis1[0].right:
lis2.append(lis1[0].right)
lis3.append(lis1[0].val)
del(lis1[0])
rlis.append(lis3)
lis1 = lis2
lis2 = []
return rlis[::-1]
不过做了上一道的话,这一道也是可以秒掉的。
毕竟我只改了一个地方。