一、创建二叉树
1.递归
2.非递归 先序
输入一个data,存入结点。分别将该结点的右、左子树的地址入栈。这里需要注意的是,不是直接将子树入栈,是地址。举个例子push(&(root->rchild));原因是,如果是直接将子树入栈,等pop出来的时候不能改变子树的地址。之后就循环弹出栈,并执行上述步骤,直到栈为空。
3.非递归 层序
每次输入结点和左、右子树的值,并用一个tag标记当前输入的是左子树还是右子树,若当输入完右子树,开始入队列(只将值不为空的结点入队列)。之后就循环弹出队列,并执行上述步骤,直到队列为空。
二、非递归遍历二叉树
1.先序:中左右。访问结点,并将其右、左子树入栈。循环弹出栈,并执行上述步骤,直到栈为空。
2.中序:左中右。循环将结点及左子树入栈,直到左子树为空。若栈不为空,弹出栈顶,访问结点,并把右子树作为下次循环开始的结点。循环上述步骤,直到当前结点为空且栈为空。
3.后序:左右中。