题目:根据后序遍历二叉树的非递归算法思想,编写算法 Print_bitree_path:输出二叉树中根结点至给定元素x的路径上的所有元素(包括根结点和x)。
不妨规定:构建二叉树,元素类型为不为0的整型,即为零时,结点为空。
思路:
借助栈来实现,用栈保留当前结点的祖先信息。
由后序遍历的特点可知,当第三次搜索到某结点时(即其左子树和右子树遍历完时)才访问该结点,而第一次和第二次搜索到某结点时,压入栈而不访问,所以需要一个标志位来判断当前结点是否已经遍历完了其左子树和右子树,规定tag==0时不访问,tag==1时访问。
当搜索到某结点不为空时,要先遍历其左子树,因而将tag赋值为0。
若当前指针结点为空,则弹出栈顶元素,根据tag判断遍历完左子树还是右子树。若遍历完左子树,则将该元素二次压入栈,tag赋为1,遍历其右孩子;若遍历完右子树(即第三次搜索到),则此时栈中元素正好是从根节点到该结点的路径经过的元素,所以应该在第三次搜索到该结点时判断该结点数据域值是否与要查找的的元素值相同。若相同,则栈中元素依次出栈;若不相同,则继续查找。
而不管第三次搜索到的元素是否为所查找的元素,其所在的双亲的左(或右)子树已经遍历完,所以要将其指向设为空。
算法描述:
1)初始化空栈,指针currentNodePtr指向根结点。
2)当当前结点currentNodePtr不为空或栈不为空时,循环执行以下操作:
[1] 若当前指针不为空,执行以下操作:
A. 定义SelemType型变量e,其数据域nodePtr赋值为当前指针currentNodePtr,标志位tag赋值为0;
B. 将e压入栈;
C. currentNodePtr指向其左孩子。
[2] 否则(即当前树结点为空时),执行下列操作:
A. 定义SelemType型变量e,弹出栈顶元素并赋给e;