树的遍历

树的遍历N叉树的遍历前序后序层序二叉树的中序遍历参考资料


N叉树的遍历

前序

递归版

由于LeetCode原题目要求有返回值,因此再构造一个递归函数并传递对返回结构的引用记录数值。对于N叉树的前序遍历,首先读取数值,然后从左向右依次对所有孩子结点进行递归调用。

非递归

前序遍历的非递归方法需要借助栈。首先根结点入栈,然后进入循环,只要栈非空,读取栈顶结点数值并从右向左将其所有孩子结点逆序入栈,继续循环。

后序

递归版

先递归,再取数(值)。

非递归

这是一个有技巧的方法,先记录下来。首先根结点入栈,然后进入循环,只要栈非空,读取栈顶结点数值并从左向右依次将孩子结点入栈。这样的结果是,对任意子树,总是先获得根结点数值,再从右向左获得所有孩子结的值。因此反转获得的数值序列得到后序遍历结果。

层序

层序遍历需要借助队列实现。根结点入队后进入循环,首先取当前队列大小,表示一层中结点数,依次取数据并将所有孩子结点入队。

二叉树的中序遍历

递归版

非递归

两种方法。

第一种,首先迭代将左孩子入栈直到没有左孩子为止,然后进入循环,只要栈非空,取栈顶数据并出栈,每当结点有右孩子时,右孩子入栈并迭代将左孩子入栈。

第二种,以根结点为当前结点,只要栈非空或当前结点存在进行循环,循环中有两部分,第一部分迭代将当前结点的左孩子入栈,第二部分取栈顶数据并出栈,使得当前结点为栈顶结点的右孩子(无论右孩子是否存在)。

 

参考资料

[1] 二叉树的遍历(前、中、后序及层次遍历,递归和非递归实现) - 何大土 - 博客园

 

back


Contact me

Please contact me about any suggestion(s): aliceb0b@hotmail.com.