二叉树遍历方法小结

来源:互联网 发布:javascript 数组初始化 编辑:程序博客网 时间:2024/06/15 02:26

二叉树深度优先遍历

一、前序遍历

过程:若二叉树非空,按下面的步骤

(1)访问根结点;

(2)按前序遍历次序遍历根结点的左子树;

(3)按前序遍历次序遍历根结点的右子树;

 

将上述递归算法转化为非递归算法:

(1)将二叉树的根结点作为当前结点;

(2)若当前结点非空,则先访问该结点,并将该结点进栈,再将其左孩子结点作为当前结点,重复步骤(2),直到当前结点为空为止;

(3)若栈非空,则栈顶结点出栈,并将当前结点的右孩子结点作为当前结点;

(4)重复步骤(2)、(3),直到栈为空且当前结点为空为止。

 

二、中序遍历

过程:若二叉树非空,按下面的步骤:

(1)按中序遍历根结点的左子树;

(2)访问根结点;

(3)按中序遍历次序遍历根结点的右子树;

 

将上述递归算法转化为非递归算法:

(1)将二叉树的根结点作为当前结点;

(2)若当前结点非空,则该结点进栈并将其左孩子结点作为当前结点,重复步骤(2),直到当前结点为空为止。

(3)若栈非空,则将栈顶结点出栈并作为当前结点,接着访问当前结点,再将当前结点的右孩子结点作为当前结点;

(4)重复步骤(2)、(3),直到栈为空且当前为空为止。

 

三、后序遍历

过程:若二叉树非空,则做如下的操作:

(1)按后序遍历次序遍历结点的左子树;

(2)按后序遍历次序遍历结点的右子树;

(3)访问根结点;

 

将上述递归算法转化为非递归算法:

(1)将二叉树的根结点作为当前结点;

(2)若当前结点非空,则该结点进栈并将其左孩子结点作为当前结点,重复步骤(2),直到当前结点为空为止。

(3)若栈非空,栈顶结点出栈作为当前结点,若是其标志为第一次进栈(flag==0),则以当前结点的标志更改(flag==1),并再次入栈,把当前结点的右孩子作为当前结点。

(4)重复步骤(2)、(3),直到栈为空且当前为空为止。

特点总结:

(1)每个结点要进栈、出栈各再次;因为左子树访问后要找栈顶元素的右子树,访问完右子树才能访问栈顶元素(相当于某子树根结点);

(2)访问完栈顶元素后,当前结点设为空,表示某子树已访问完,重新找根结点,访问其右子树。

(3)为区别同一个结点的再次进栈,需要设置一个标志(flag)。

Flag=0,第一次进栈,表示该结点出栈之后不能访问。

Flag=1,第二次进栈,表示该结点出栈之后可以访问。

 

二叉树广度优先遍历

(1)遍历前先将二叉树的根结点存入队列中;

(2)然后依次从队列中取出队头结点,每取出一个结点,都先访问该结点;

(3)接着分别检查该结点是否存在左、右孩子,若存在则先后入列;

(4)重复步骤(2)、(3),直到队列为空为止。

原创粉丝点击