前序遍历,并且和我以前写的非递归前序遍历实现形式上并不一样
是先入根节点,然后开始
1.出栈
2.打印
3.先右后左的入栈
这样的打印出来的就是根左右
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def fun1(root):#二叉树的前序遍历的递归形式,非递归代码
'''
思路:
1.将当前栈顶元素出栈
2.打印弹出节点
3.先右再左的压栈
4.不断重复这个过程
:param root:
:return:
'''
stack=[root] #首先将根节点入栈
ls=[]
while stack:#栈不为空 可以进来
root=stack.pop()
ls.append(root.val)
stack.append(root.right)
stack.append(root.left)
return ls
这个是和上面思路一样,不过是根右左的遍历方式
这样逆序输出的时候就是左右根的后序遍历
def fun2(root):#后序遍历
'''
先把根节点入栈
前序遍历是根左右,那么我如果根右左的方式遍历会得到什么,准备一个收集栈
1.出栈
2.打印
3.先左再右(先打印右边的根,在打印左边的根)
就是说我先以根右左的方式进行遍历,但是不打印全部入栈
这个时候我逆序输出不就是左右根了吗
:param root:
:return:
'''
if root == None:
return []
stack = [root]
souzhan = []
while stack: # 栈不为空则进来
root = stack.pop()
souzhan.append(root.val)
if root.left:
stack.append(root.left)
if root.right:
stack.append(root.right)
souzhan.reverse()
return souzhan
前序遍历的另一种非递归形式
def fun3(root):#前序遍历的另外一种非递归形式
stack=[]
ls=[]
while stack or root:#只要栈不为空,或者根节点不为空则进来
while root:#当前节点不为空,往左走
stack.append(root)#往栈里面添加节点
ls.append(root)#往ls里面添加节点
root=root.left
#循环结束意味着当前节点为空走到了能走到的最左边
root=stack.pop().right
return ls
中序遍历,具体的实现和前序的非递归长得很相似
记住前序后序基本上就没问题了
def fun4(root):
stack = []
ls = []
while stack or root: # 只要栈不为空,或者根节点不为空则进来
while root: # 当前节点不为空,往左走
stack.append(root) # 往栈里面添加节点
root = root.left
# 循环结束意味着当前节点为空走到了能走到的最左边
root = stack.pop()
ls.append(root.val) # 往ls里面添加节点
root=root.right
return ls