- 前序遍历
- 中序遍历
- 后序遍历
前序遍历
DLR,访问顺序:根节点、左子树、右子树
递归:
1 | void PreOrder(BTree T){ |
中序遍历
LDR,访问顺序:左子树、根节点、右子树
递归:
1 | void InOrder(BTree T){ |
非递归(栈):
1 | void InOrder(BTree T) { |
感觉do-while有点奇怪,记得试着改下。
后序遍历
LRD,访问顺序:左子树、右子树、根节点
递归:
1 | void PostOrder(BTree T){ |
非递归方法需要注意的问题是,当指针p指向某一个节点时,不能马上对它进行访问,要先遍历左子树,因此p先进栈;左子树遍历完后,再遍历该节点(退栈)时,还不能访问,要先遍历右子树,p再次进栈。所以需要引入一个标识变量flag,为0表示节点暂不访问,为1表示可以访问,需要两个栈,一个栈存节点,一个栈存对应的flag
1 | void PostOrder(BTree T){ |