你会学到什么?
树的递归遍历算法很容易理解,代码也很精简,但是如果想要从本质上理解二叉树常用的三种遍历方法,还得要思考树的非递归遍历算法。
读完后的收获:
- 您将学到二叉树的中序遍历的非递归版本
- 明白栈这种数据结构该怎么使用
讨论的问题是什么?
主要讨论二叉树的非递归版中序遍历该如何实现,包括借助什么样的数据结构,迭代的思路等。
这个问题相关的概念和理论
遍历
Traversal 指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。
二叉树组成
二叉树由根结点及左、右子树这三个基本部分组成。
中序遍历
Inorder Traversal 访问根结点的操作发生在遍历其左、右子树之中间。
非递归版中序遍历算法
这里我们以二叉树为例,讨论二叉树的中序遍历的非递归版实现。
我们先看下二叉树的节点TreeNode的数据结构定义。
节点的数据域的类型定义为泛型 T,含有左、右子树,及一个带有数据域的构造函数。
public class TreeNode<T>
{
public T val { get; set; }
public TreeNode<T> left { get; set; }
public TreeNode<T> right { get; set; }
public TreeNode(T data)
{
val = data;
}
}
代码思考
中序遍历,首先遍历左子树,根节点,最后右子树,这里的顺序性,我们借助栈 First In Last Out 的数据结构