二叉树
leetcode刷题的时候遇到关于二叉树的问题,这里做一个整理。
概要:
二叉树的搜索主要分为深度优先搜索(DFS)和广度优先搜索(BFS)。其中深度优先搜索中又分为:前序遍历(preOrder)、中序遍历(inOrder)后后序遍历(postOrder)。二叉树的遍历通常使用递归算法或者栈来实现。
1. 深度优先搜索
(1)前序遍历: 遵循根->左->右的顺序
#递归方法 def preOrder(root): if not root: return print(root.val) preOrder(root.left) prtOrder(root.right) #利用栈的迭代方法 def preOrder(root): stack = [root] #定义一个列表 while(stack): ptr = stack.pop() #出栈 if ptr: print(ptr.val) stack.append(ptr.right) stack.append(ptr.left)
(2) 中序遍历:遵循左->根->右的顺序
#递归方法 def inOrder(root): if not root: return inOrder(root.left) print(root.val) inOrder(root.right) #迭代方法 def inOrder(root): stack = [root] while(stack or root): while(root): stack.append(root.val) root = root.left #遍历完左子树 root = stack.pop() #保存当前节点,因为还要继续遍历这个节点的右孩子 print(root.val) root = root.right
(3)后序遍历:遵循左->右->根的顺序。
#递归方法 def postOrder(root): if not root: return postOrder(root.left) postOrder(root.right) print(root.val) #迭代方法 def postOrder(root): stack = [] last_visit = null while(root or !stack.empty()): while(root): stack.append(root) root = root.left top = stack.top() #取出栈顶元素 if (top.right ==null or last_visit == top.right): #因为访问根节点时肯定是从其右孩子返回的 stack.pop() print(top.data) last_visit = top else: root = root.right