广度优先遍历
思想:使用队列,每一层,先将自己遍历后,在将孩子进队列,左先右后。
def broad_travel(self, root, func):
queue = [root]
while queue:
node = queue.pop(0)
func(node.data)
if node.lchild:
queue.append(node.lchild)
if node.rchild:
queue.append(node.rchild)
深度优先遍历(非递归)
思想采用栈来保存先驱节点。
线序中序侯旭分开做。先序即遍历时第一次经过是就处理,中序是第二次,后续是第三次。
先序遍历:
思想:一直沿着树向左走,遍历自己的时候,同时将左右字节点入栈,由于栈是先入后出的,所以,要先压右孩子再压左孩子,初始值先将root节点入栈。
def deep_travel_first(self, root, func):
stack = [root]
last_pop=None
while stack:
node = stack.pop() #last item
func(node.data)
if node.rchild :
stack.append(node.rchild)
if node.lchild :
stack.append(node.lchild)
中序遍历
思想:一直沿着树向左走,如果左孩子为空,则pop自己,处理,然后将右孩子作为根节点,然后再继续向左走。