二叉树深度优先遍历
一、前序遍历
过程:若二叉树非空,按下面的步骤
(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),直到队列为空为止。