这里主要是对二叉树进行学习
第一部分主要是针对二叉树的定义来学习的,二叉树实际上可以理解成有左右方向的链表,拥有链式存储和线性存储两种方式,但是我们一般使用链式存储。
二叉树的遍历也是十分重要的点,后面二叉树的相关题目很多就是围绕二叉树遍历来做的。分为深度优先遍历和广度优先遍历。
深度优先遍历就是前序遍历、中序遍历、后序遍历三种。
广度优先遍历就是层序遍历。
我个人感觉层序遍历应用范围很广,而前中后序遍历可以看代码随想录网站上面的这个图:
接下来是二叉树的定义,在leetcode上是核心代码模式就不用写定义,但是一般都得去定义好:
Class TreeNode:
def __init__(self,val):
self.val=val
self.right=None
self.left=None
第二部分就是二叉树的遍历实现,首先是递归遍历,递归的方法非常简单但是抽象。
前序遍历
def getNode(self,root):
if not root:
return None
left=self.getNode(root.left)
right=self.getNode(root.right)
return [root.val]+left+right #注意这里的[root.val]会带着val
后序遍历就是把return改一下成
return left+right+[root.val]
中序遍历就是把return改一下成
return left+[root.val]+right
第三部分是二叉树的迭代遍历:迭代遍历这里使用栈来做
前序遍历
def getNode(self,root):
if not root:
return []
stack=[root]
result=[]
while stack:
Node=stack.pop()
result.append(Node.val)
if Node.right:
stack.append(Node.right)
if Node.left:
stack.append(Node.left)
return result
后序遍历,后序遍历可由前序遍历稍微修改得到,先改变左右的顺序,然后再翻转result即可
def getNode(self,root):
if not root:
return []
stack=[root]
result=[]
while stack:
Node=stack.pop()
result.append(Node.val)
if Node.left:
stack.append(Node.left)
if Node.right:
stack.append(Node.right)
return result[::-1]
中序遍历的遍历流程有所不同,使用了指针来访问节点
def getNode(self,root):
if not root:
return []
stack=[]
result=[]
cur=root
while cur or stack:
if cur:
stack.append(cur)
cur=cur.left
else:
cur=stack.pop()
result.append(cur.val)
cur=cur.right
return result