1.递归的方法
对于二叉树而言首先需要建立一个二叉树结点的结构体,因为对于每个节点而言都是相似的结构:
(1)节点里的数据;
(2)指向左节点的节点指针;
(3)指向右节点的节点指针;而同时左右指向的又是相同的节点结构,所以需要建立这样的结构体;
当然其中的数据可以是更复杂的结构。
而对于一个二叉树而言,所谓前中后顺序遍历,其实只是根据遍历时根所在的位置来决定,前序代表:根-左-右;中序代表:左-根-右;后序代表:左-右-根。而一个二叉树可以看成是一个由很多小节点组成的大的节点,所以所有的节点都可以按照一个顺序进行遍历。这也二叉树可以遍历的原因。
而遍历的方法很简单就前序遍历而言,首先需要输出根内存放的数据,然后对边节点继续进行遍历,最后在对右边的节点进行遍历:
同理中序和后序遍历按照之前分析的就是
2.栈模拟
递归本身就是运用栈的结构进行的,所以可以使用栈的结构进行递归模拟;
3.Morris算法
Morris算法是一种迭代遍历二叉树结构的算法;
①中序遍历与先序遍历
Morris算法中对于二叉树的先序和中序遍历的处理方法比较一致:
假如有左子树,从左子树中获得该结点的前驱结点,得到前驱结点后将该结点的右指针接到当前结点,也相当于前驱结点的右孩子为当前结点,并且当前结点变为左孩子;
而当在找前驱结点时发现成环时,说明该结点已经是遍历过一遍也说明左子树已经是没遍历过的最后一个左子树,此时需要将结点的右子树连接解开,并走到该结点的右孩子中;
假如一个结点没有左子树,说明该结点就是最左边的一个结点;
而中间有两个关键环节,第一个是成环,第二个是找到环后的回溯;第一次成环时就输出自身值时先序遍历,而回溯时才输出自生值是中序遍历;
代码实现:
先序遍历:
中序遍历:
②后序遍历
后序遍历的不同点在于回溯发生在到达叶子节点时发生,但是不能判断此时的情况,所以不能采用这种结构来进行后序遍历的输出;
但是由于回溯之前一定是会到左子树已经遍历完的根节点,对于该节点的左子树平行位置进行反向输出即可: