深度优先思想解决二叉树的前序遍历

对于深度优先搜索算法的一个经常会遇到的问题就是关于二叉树的遍历,主要使用的是同样是递归和非递归的方法来实现二叉树的遍历,并且是二叉树的前序遍历,对于二叉树的前序遍历的过程主要是在访问二叉树的节点过程中,对于要遍历的这个二叉树以及这个二叉树的所有子树,都是先访问树的根节点,然后再左子树,最后是右子树的过程。如果说给定一颗二叉树如下:

深度优先思想解决二叉树的前序遍历_第1张图片

添加图片注释,不超过 140 字(可选)

递归的方式来实现,就是函数自己调用自己,也就是递归方式实现二叉树的前序遍历,就先需要访问根节点,然后对根节点的左节点使用同样的方法进行访问,最后就是对右节点进行同样方式的访问,python实现的方式如下:

def visitTree(root):
    if not root:
        return 0
    print(root.val)
    visitTree(root.left)
    visitTree(root.right)

而对于使用非递归的方式来实现二叉树的前序遍历,就需要使用新的数据结构,也就是栈,对于栈的使用首先要知道栈的最主要的特性,也就是栈是先进后出,先进入栈的数据最后才能出栈,python中的栈可以使用list列表来实现,将list的最后一个数据pop掉也就是相当于栈的出栈行为,append一个新的元素,也即是在栈的末尾添加一个数据,也就是进栈行为。二叉树的前序遍历也就是先将根节点入栈,然后惊醒一个迭代的过程,栈不为空就弹出栈顶的元素进行输出,然后就将右子节点入栈,最后才是左子节点入栈,这样就通过栈的先入后出的特性实现遍历左子树后再遍历右子树,也就完成了前序遍历的过程。python实现的过程如下:

def visitTreeWithout(root):
    stack = []
    stack.append(root)
    while len(stack) != 0:
        top = stack.pop()
        print(top.val)
        if top.right: stack.append(top.right)
        if top.left: stack.append(top.left)

深度优先思想解决二叉树的前序遍历_第2张图片

添加图片注释,不超过 140 字(可选)

上图是先将根节点入栈,然后开始while迭代,进入循环体由于根节点1在栈顶,就先将根节点出栈输出,然后进行入栈,先将右节点3入栈,然后再左节点2入栈,入栈结束后,栈顶节点2出站并输出。

深度优先思想解决二叉树的前序遍历_第3张图片

添加图片注释,不超过 140 字(可选)

2节点的右节点空,所以左节点4入栈,栈顶元素4又出栈输出,4节点是叶子节点没有子节点,所以栈顶元素就是3,将3节点出栈并输出,然后就是入栈,3节点的右节点6入栈,左节点5入栈,5和6都是叶子节点,分别出栈后输出,就完成了整个前序遍历的过程。

你可能感兴趣的:(深度优先,数据结构,算法)