二叉树遍历

题目:二叉树的遍历

解法一:递归遍历,也是实现起来,最简单的方式。

写递归算法的核心三大要素:1.确定递归函数的参数 和 返回值。都是关键的信息。

                                               2.确定终止条件。用心思考,到底啥才是本次递归终止的条件

                                               3.确定单层递归的逻辑。                       

前序遍历:中左右

二叉树遍历_第1张图片 二叉树遍历_第2张图片

中序:左中右

二叉树遍历_第3张图片

二叉树遍历_第4张图片 

 后续:左右中

二叉树遍历_第5张图片

 解法二:迭代法

解题思想:使用一个栈,然后按照顺序把二叉树内的元素,放进去,然后弹出的时候,对其处理。

前序

二叉树遍历_第6张图片

 后序:后序就是前序的一点变化。​​​​​​​二叉树遍历_第7张图片

 

 中序:这个就一点不同,不能通过先序做变化得到。因为前序,后序都是遍历顺序和处理的顺序相同,但是中序遍历和处理的顺序不一样。所以呢?没办法边遍历的同时就直接处理了数据。

思想,指针变量二叉树,一直往左走。然后把遍历过的元素入栈,然后按照出栈的顺序去处理它,一旦发现cur->left为空了,那么说明当前的这个小层里面(左中右)的左已经为空了,所以接下来处理中元素,这个元素就是保存在栈里面,也是当前的栈顶元素。让这个元素出栈,并且它对应的数值放进我们准备的数组里面,然后就是处理这个元素的右孩子,发现右孩子也为空,指针此时指向空的话。此时弹出栈顶的元素。他就是现在要处理的元素。然后访问这个元素的右孩子(因为左孩子已经遍历过了),不为空则,入栈。然后判断让的左孩子,(左孩子为        空的话,弹出栈顶的元素,处理它)右孩子为空的话,依旧从栈中弹出栈顶的元素,处理它。   (昂理解了,左孩子为空弹出的元素是当前这个层次的中,右孩子为空,说明当前这个小层次完毕了,所以弹出的是上下一层次的元素。)如果栈为空,不能再弹出元素了,就退出了。所以是指针不为空或者,栈不为空,那么都可以继续循环。

一直入栈一值入栈,直到左孩子为空,那么说明此时已经是最左边的孩子了,它是这个层次的中。(左空,中,右)然后就从栈里弹出元素,处理当前这个中的元素。然后处理完了之后,就去访问这个元素的右孩子,如果右孩子不为空,那么处理它。(具体就是右孩子先入栈,然后以这个右孩子当做中,看这个元素有没有左孩子,有的话左孩子入栈。然后呢?如果当前这个左孩子的左孩子为空的话,就可以弹出上面那个左孩子了,)如果为空则,栈弹出上一个元素。处理它。

极简:只要二叉树指针不为空或者栈不为空,就一直循环执行。然后只要指针不为空,就走它的左孩子,直到左孩子为空。然后就处理它当前栈里面的元素,保存,弹出,元素对应数值尾插数组,然后,指针指向当前元素的右孩子........直到指针指向空并且栈为空退出循环。

二叉树遍历_第8张图片

 

 核心思想:二叉树指针没指向空,或者栈不为空,就继续循环。然后中序是左中右。我们使用一个指针,一直从左子树遍历数组,采用把遍历过的元素都保存到栈里面,然后直到指针的左孩子指向空,说明当前指针指向的元素,就是当前层次中的 中。要处理它,就让他出栈,然后把它对应的值,尾插数组。然后看它的右孩子。如果有右孩子,则操作右孩子,如果没有右孩子,指针指向空,那么就再次弹出栈顶元素。操作栈顶元素。

你可能感兴趣的:(算法)